1、安装mysql

  在linux版本下,mysql称为mariadb,可以选择在线安装,或编译安装。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

  用国内镜像源替换官方的MariaDB镜像源,目前MariaDB最新版本10.4,这里选10.3作为稳定版安装,本人项目或者测试环境,都是以MariaDB为主。

vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum install mariadb mariadb-server -y
systemctl restart mariadb
systemctl enable mariadb
mysql_secure_installation
# 该命令为重置root密码,并做一些安全配置,若不做配置,后续将无法使用sell进入mysql
2、配置主备server的my.cnf

  通过my.cnf可以优化或者定制更高级的mysql使用,具体参考另外一篇文章todo,这里只写简单主主同步配置

主服务器

[mysqld]
# 数据目录可以使用默认也可以自行定义,所有的binlog以及db物理文件都在datadir里面后期可以通过挂载存储扩容
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
# 开启日志模式
log-bin=mysql-bin
relay-log=mysql-relay-bin# 双主模式下,防止两边插入插入时,自增键冲突,主服务器自增规则:1,3,5奇数自增
auto_increment_offset=1
auto_increment_increment=2
log_slave_updates =1
# 忽略一些测试表
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=performance_schema.%#出现错误后忽略,若不跳过,出现任何同步错误,slave-IO进程会终止
slave-skip-errors=all

备服务器

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sockserver-id=2log-bin=mysql-bin
relay-log=mysql-relay-bin# 双主模式下,防止两边插入插入时,自增键冲突,备服务器自增规则:2,4,6奇数自增
auto_increment_offset=2
auto_increment_increment=2
log_slave_updates =1replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=performance_schema.%#出现错误后忽略,若不跳过,出现任何同步错误,slave-IO进程会终止
slave-skip-errors=all
3、创建新账户

  在主服务器,备服务器分别创建用于管理主备的msyql帐号,请勿用root账户,以免出现安全问题!

mysql -u root -psd123321sd
create user 'sync_acct'@'192.168.100.%' identified by '*&@jall190';
grant replication slave on *.* to 'sync_acct'@'192.168.100.%';# 以下两条配置可以实现在shell中mysql -usync_acct -p*&@jall190 直接登录,否则会提示如下:
# ERROR 1045 (28000): Access denied for user 'sync_acct'@'localhost' (using password: YES),登录失败
# grant select,insert,update,delete on
GRANT ALL PRIVILEGES ON *.* TO sync_acc@"127.0.0.1" IDENTIFIED BY "*&@jall190" WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO sync_acc@"localhost" IDENTIFIED BY "*&@jall190" WITH GRANT OPTION;flush privileges;
exit# 查看可本地登录的记录
MariaDB [(none)]> select HOST,User from mysql.user;
+-----------------------+-----------+
| HOST                  | User      |
+-----------------------+-----------+
| 127.0.0.1             | root      |
| 127.0.0.1             | sync_acc  |
| 192.168.100.%         | sync_acct |
| ::1                   | root      |
| localhost             | root      |
| localhost             | sync_acc  |
| localhost.localdomain | root      |
+-----------------------+-----------+
4、查看主服务器bin-log信息
#对数据库进行只读锁定(防止查看二进制日志同时有人对数据库修改操作)
MariaDB [(none)]> flush tables with read lock;
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      504 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> unlock tables;

以上的file名称:mysql-bin.000002跟position:504在一下主备需要用到

5、分别在主备服务器上配置主-主模式

(1) 在备服务器上,配置db1-192.168.100.5作为master

# 直接在命令行上敲
MariaDB [(none)]> change master to
master_host='192.168.100.5',
master_port=41210,
master_user='sync_acct',
master_password='*&@jall190',
#指明初始复制时的mysql1中的binlog文件
master_log_file='mysql-bin.000003',
#指明初始复制时binlog文件的位置
master_log_pos=655;MariaDB [(none)]> start slave;

​ 从服务器开启slave线程后,通过show slave status\G可以看到一些信息,这里\G是表示按竖立显示

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.100.5Master_User: sync_acctMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 4041005Relay_Log_File: mysql-relay-bin.000003Relay_Log_Pos: 4041030Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes......

以上信息可知

#这个是指Slave连接到Master的状态,当前IO线程的状态为等待master发送事件,该字段显示mysql不同状态的不同信息,而且信息简单易读
Slave_IO_State: Waiting for master to send event:Slave_IO_Running: Yes,显示slave的I/O线程是否被启动并成功地连接到主服务器上。
Slave_SQL_Running: Yes,显示slave上用于读取Relay_Log的SQL线程是否被启动

另外,备份Slave_IO_State信息对于在主服务器上的状态,用show processlist查看主服务器显示master已经发送所有的binlog到salve,并等待主服务器更新这个binlog

MariaDB [(none)]> show processlist\G;
*************************** 1. row ***************************Id: 24User: sync_acctHost: 192.168.100.6:35474db: NULLCommand: Binlog DumpTime: 1143State: Master has sent all binlog to slave; waiting for binlog to be updatedInfo: NULL
Progress: 0.000

以上说明,主-备模式成功配置,但还不是主-主模式

(2) 在(1)上,已经配置好主-从同步,且已经验证可正常写入同步,这里,将配置主-主模式,在主服务器db2-192.168.100.5上,配置db2-192.168.100.6作为master

# 直接在命令行上敲
MariaDB [(none)]> change master to
master_host='192.168.100.6',
master_user='sync_acct',
master_password='*&@jall190',
# 以下两个字段的值,务必在从服务器上,用show master status 查看相关值
master_log_file='mysql-bin.000003',
master_log_pos=587;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.100.6Master_User: sync_acctMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 587Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 529Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: Yes
......

(3)在第(1)、(2)已经成功完成主-主模式,但也仅仅是说明msyql主主配置正常,但还未通过数据写入来测试其正确性,可通过以下简单的两个步骤测试主-主模式数据的同步

  • 主服务器上新建一个databases,创建一个简单表,观察slave是否同步新建情况
  • 在刚新建的表里插入一条记录,观察slave对应的表是否也多一条记录
  • 在备服务器上drop 掉刚建的数据库,然后在salve重复以上操作,观察master上数据同步情况
# 这里仅简单给出一些命令,不再具体展开
create database erp_app;
use erp_app;
create table if not exists apps_name(
id int(4) not null primary key auto_increment,
app_log_name char(20) not null,
log_path char(200) not null,
log_date timestamp default current_timestamp
);
show tables
#插入数据,因为id是自增,无需自行插入,使用null交给mysql自动插入相应id号
insert into apps_name values(null,'BI-Access-Log','/opt/data/apps_log/',null);

使用python插入数据做测试使用,后面可作为验证主-主故障切换使用

import time
import pymysql
db_info={'host':'192.168.100.5','port':3306,'user':'root','password':'****','db':'erp_app','charset':'utf8'}try:conn = pymysql.connect(**db_info)insert_sql = ("insert into apps_name ""(id,app_log_name,log_path,log_date) ""values(null,%(app_log_name)s,%(log_path)s,null)")insert_data={'app_log_name':'BI-Access-Log','log_path':'/opt/data/apps_log/'}with conn.cursor() as cur:while True:resl=cur.execute(insert_sql,insert_data)print(resl)time.sleep(2)conn.commit()
except pymysql.MySQLError as err:print(err)conn.rollback()finally:conn.close()

在第2点配置my.cnf,设定了自增键规则,也可以验证主、从插入数据时,其自增键的情况

在主服务器重新插入四条,id为奇数id:

MariaDB [erp_app]> select * from apps_name;
+----+---------------+
| id | app_log_name  |
+----+---------------+
|  1 | BI-Access-Log |
|  3 | BI-Access-Log |
|  5 | BI-Access-Log |
|  7 | BI-Access-Log |
+----+---------------+

清空之前测试的数据,在备服务器重新插入四条,id为偶数id:

MariaDB [erp_app]>  select * from apps_name;
+----+---------------+
| id | app_log_name  |
+----+---------------+
|  2 | BI-Access-Log |
|  4 | BI-Access-Log |
|  6 | BI-Access-Log |
|  8 | BI-Access-Log |
+----+---------------+

但是这种配置自增算法有bug,只在双主模式下,假设现在要三台服务器都作为主,互相同步,那么现有的自增键策略无法扩展,其实有两种可行方案:

第一种:

# 通过增大步长,例如有10台,步长值=主服务器数量,解决自增键冲突
# 服务器1
auto-increment-increment = 10
auto-increment-offset   = 1
# 服务器2
auto-increment-increment = 10
auto-increment-offset   = 2
# 服务器3
auto-increment-increment = 10
auto-increment-offset   = 3
......#服务器10
auto-increment-increment = 10
auto-increment-offset   = 10

第二种:数据库表不设置自增字段,由程序逻辑用UUID实现id唯一值,个人推荐此方式,不受限制。

注意

在主从模式下,或者主-主模式下,测试数据过程中,例如在master上进行drop erp_app时,若slave不存在erp_app数据库(主从分离连接后,从已先删除),slave将无法进行同步删除操作,后续的同步操作也无法正常进行,show slave status\G,看到有报错提示db不存在无法drop的信息:

Last_SQL_Errno: 1008
Last_SQL_Error: Error 'Can't drop database 'erp_app'; database doesn't exist' on query. Default database: 'erp_app'. Query: 'drop database erp_app'

需在两台服务器上进行如下设置,如果已经在my.cnf配置文件配好slave-skip-errors=all可跳过一下设置

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)# 将同步指针向移动下一个位置,跳过异常,以便mysql可继续执行下一个同步操作
MariaDB [(none)]> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

(4)查看binlog,relay-log,创建数据库对应的物理存储文件

[root@localhost mysql]# ls
aria_log.00000001  ibtmp1             mysql-bin.000003  mysql-bin.000010  mysql-bin.index
aria_log_control   localhost.pid      mysql-bin.000004  mysql-bin.000011  mysql-relay-bin.000050
erp_app            master.info        mysql-bin.000005  mysql-bin.000012  mysql-relay-bin.000051
ib_buffer_pool     multi-master.info  mysql-bin.000006  mysql-bin.000013  mysql-relay-bin.index
ibdata1            mysql              mysql-bin.000007  mysql-bin.000014  mysql.sock
ib_logfile0        mysql-bin.000001   mysql-bin.000008  mysql-bin.000015  performance_schema
ib_logfile1        mysql-bin.000002   mysql-bin.000009  mysql-bin.000016  relay-log.info

相关文件说明:

master.info:主库A的账户密码等同步基本配置信息

mysql-bin.index:记录主库A所有的binlog日志文件

./mysql-bin.000001
./mysql-bin.000002
./mysql-bin.000003
./mysql-bin.000004
./mysql-bin.000005
./mysql-bin.000006
./mysql-bin.000007
./mysql-bin.000008
./mysql-bin.000009
./mysql-bin.000010
./mysql-bin.000011
./mysql-bin.000012
./mysql-bin.000013
./mysql-bin.000014
./mysql-bin.000015
./mysql-bin.000016
~

mysql-bin.000**:主库A的binlog日志里的sql操作命令,vi该二进制文件进去可以看到sql命令

^@^@^@^@^@^@^@<84>芦盲6贸bZ]^B^B^@^@^@}^@^@^@茫     ^@^@^@^@        ^@^@^@^A^@^@^@^G^@^@^_^@^@^@^@^@^@^A^@^@ T^@^@^F^Cstd^C^B^@^B^@^D!^@!^@^H^@erp_app^@insert into apps_name values(null,'BI-Access-Log')陆@莽篓贸bZ]^P^B^@^@^@^@^@^B

relay-log.info:记录最新使用日志信息

mysql-relay-bin.000**:主库A在主库B同步回来的中继日志文件,记录主库B执行过的SQL命令

mysql-relay-bin.index:中继日志的索引文件,记录所有relay日志文件

从上面的相关物理文件,也可看出msyql主从同步过程

从库的IO线程 把主库mysql-bin.000** 日志append到本机的中继日志文件mysql-relay-bin.000**
从库SQL线程 执行本机中继日志文件里的sql命令,将数据写入进本机。

通过show processlist也可清晰看到相关线程的作用:

Slave_IO线程说:正在等待主库发送事件

Slave_SQL线程说:本从库已经读完所有中继日志,正在等待Slave_IO线程更新到中继日志文件(或新建一个中继日志文件)

Binlog Dump:(这个线程说明,本机也是主库角色)本机已经把所有binlog发送到了从库,正在等待本机更新binlog

MariaDB [(none)]> show processlist\G
*************************** 6. row ***************************Id: 10User: system userHost: db: NULLCommand: Slave_IOTime: 812State: Waiting for master to send eventInfo: NULL
Progress: 0.000
*************************** 7. row ***************************Id: 11User: system userHost: db: NULLCommand: Slave_SQLTime: 812State: Slave has read all relay log; waiting for the slave I/O thread to update itInfo: NULL
Progress: 0.000
*************************** 8. row ***************************Id: 13User: sync_acctHost: 192.168.142.4:51432db: NULLCommand: Binlog DumpTime: 772State: Master has sent all binlog to slave; waiting for binlog to be updatedInfo: NULL
Progress: 0.000

(5)查看mariaDB 存储引擎

MariaDB [(none)]> show variables like 'storage_engine';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+

可在my.cnf配置文件下设置’default-storage-engine=?'更改默认引擎,这是全局修改

若修改表的存储引擎 alter table table_name engine=engine_name;

6、keepalived配置以及VIP漂移策略

(1)keepalived配置/etc/keepalived/keepalived.conf,权限必须为644

! Configuration File for keepalivedglobal_defs {# 邮箱预警设置简单,不再说明notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}#notification_email_from Alexandre.Cassen@firewall.loc#smtp_server 192.168.200.1#smtp_connect_timeout 30   #以下两行处理脚本执行权限问题script_user rootenable_script_security router_id hdA # 备服务器hdB,主、备的router_id必须不同,否则VRRP无法选举vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0}# 检测db主-主同步脚本
vrrp_script chk_mariadb_sync {script "/etc/keepalived/check_db_sync.sh"interval 2weight 10
}vrrp_instance VI_1 {# 非抢占模式state BACKUPnopreemptinterface ens33virtual_router_id 51priority 100 # 备服务器99advert_int 1authentication {auth_type PASSauth_pass 89287201}virtual_ipaddress {192.168.100.7}
}track_script {chk_mariadb_sync}

(2) mariaDB 同步状态检测脚本 /etc/keepalived/check_db_sync.sh

注意,这里别用root账户,保证一定安全,chmod 744 check_db_sync.sh

#!/bin/bash
mysql_bin=/usr/bin/mysql
user=sync_acc
pw=passPass
host=127.0.0.1
port=3306
# Seconds_Behind_Master
sbm=60io_thread_state=`$mysql_bin -h $host -P $port -u$user -p$pw -e 'show slave status\G'  2>/dev/null|grep 'Slave_IO_Running:'|awk '{print $NF}'`
echo $io_thread_statesql_thread_state=`$mysql_bin -h $host -P $port -u$user -p$pw -e 'show slave status\G' 2>/dev/null|grep 'Slave_SQL_Running:'|awk '{print $NF}'`
echo $sql_thread_stateSBM=`$mysql_bin -h $host -P $port -u$user -p$pw -e 'show slave status\G' 2>/dev/null|grep 'Seconds_Behind_Master:'|awk '{print $NF}'`
echo $SBM#Check for $mysql_bin
if [ ! -f $mysql_bin ];thenecho 'the path of mysqlbin is incorrect,please check msyql path'exit 2
fi# check mysql status whether is dead
service mariadb status &>/dev/null
if [ $? -ne 0 ];thenpkill keepalivedecho 'mysql is dead'exit 1
fi# -z 表示如果$IOThread变量为空,说明数据库服务不可用,已down
if [[ -z "$io_thread_state" ]];thenpkill keepalivedecho 'mysql is dead'exit 1
fiif [[ "$io_thread_state" == "Connecting" && "$sql_thread_state" == "Yes" ]];thenecho 'master is down,but slave still works'exit 0# Seconds_Behind_Master timeoutelif [[ $SBM -ge $sbm ]];thenpkill keepalivedexit 1elseexit 0
fi

VIP切换到正常的主服务逻辑:

1)主A,主B db数据库正常,IO线程同步正常,vip被主A占用

2)主A数据库down后,如检测脚本所示,脚本把主A 的keepalived服务kill掉,此时VIP飘移到主B服务器,实现故障转移,对于主B,它的线程连接主A超时,无法同步,但仍可对外提供db服务:

Slave_IO_State: Reconnecting after a failed master event read
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes

3)当主A 恢复数据库后,主A重启 keepalived服务,因为配置为非抢占模式,故此时还是由主B对外提供db服务

4)如果主A、主B服务都down了? 你应该在此之前准备好相关邮件或者短信监控并人工介入

补充:VIP漂移策略不一定按上述情况,可自行加入数据库相关的监控指标来确定脚本,也可用python作为脚本

7、 在防火墙写入ACL,开放相关端口

个人发现csdn上绝对大部分博客教程,尤其在前期配置环境这一类文章,一律跳过防火墙设置,直接停掉防火墙,以便快速部署,部署成功后,大部分文章会忽略最后加入防火墙设置,事实上一旦形成这种“偷懒的”习惯,在生成环境很容易出现“服务器、数据、漏洞安全”,即使服务内网使用。而且当前网络安全形势突出,在参与2019护网行动以及等保工作中,对安全有了较深刻体会。

1) 端口加入防火墙,防火墙设置分为centos7.5 firewalld和centos6或者redhat6.5的iptables,因为本人长期使用centos发行版,这里给出的是firewalld的设置

firewall-cmd --state
systemctl start firewalld
systemctl enable firewalld
# 测试端口连通性,很多人会用telnet测试端口是否打开,但centos默认没有telnet服务,其实针对tcp层连通性测试,使用http协议也一样,而且系统自带wget命令,非常方便测试
在备服务器上,关闭防火墙的两种情况
[root@localhost ~]# wget http://192.168.100.5:3306
--2019-08-16 10:50:59--  http://192.168.100.5:3306/
Connecting to 192.168.100.5:3306... connected.# 打开防火墙,默认并未放通3306端口
[root@localhost ~]# wget http://192.168.100.5:3306
--2019-08-16 10:51:10--  http://192.168.100.5:3306/
Connecting to 192.168.100.5:3306... failed: No route to host.
# 限制仅192.168.100.0/24网段能访问端口3306
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="3306" accept"# 更新防火墙规则
firewall-cmd --reload或firewall-cmd --complete-reload
(两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务)

2) 开放VRRP协议,用于keepalived 主备状态检测

# 主备都运行下面的命令,从组播地址224.0.0.18,可以看出VRRP用了组播协议
# 入方向
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 出方向
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

MariaDB+Keepalived 搭建双主HA数据库服务相关推荐

  1. mysql 双主 脑裂_MySQL 高可用性keepalived+mysql双主

    防伪码:明日复明日,明日何其多. 生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL 服务器如果其中有一台 MySQL 服务器挂掉后,另外一台能立马接替其进 ...

  2. 2台mysql高可用性_MySQL 高可用性keepalived+mysql双主

    生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL 服务器如果其中有一台 MySQL 服务器挂掉后,另外一台能立马接替其进行工作. MySQL 的高可用方案 ...

  3. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

    MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...

  4. mysql hma 分布式_mysql基础之mariadb集群双主(主主)架构

    一.概念 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加m ...

  5. keepalived+mysql双主高可用配置

    具体架构图如下 两个节点一主一从(从库上面也可以再挂一个从库),或者是双主,再利用keepalived在出现容灾时进行高可用切换. Keepalived原理说明: 其实这个原理可以很简单的用一个故事说 ...

  6. MySQL 学习 - Replication集群 - 搭建 - 双主双从

    前言 我们这里说的是双主双从集群搭建,当然这个是看你实际业务,说白了一点 两个主节点双向同步,A集群挂掉时,B集群因为双向同步,立即可以开始工作,实现高可用 基本原理 具体流程 主库将变更写入到主库的 ...

  7. centos MySQL 双机_CentOS利用Keepalived构建双主MySQL+双机热备

    之前的文章介绍了如何配置MysqL双主互备,见http://www.linuxidc.com/Linux/2013-05/83784.htm 这里介绍如何配合前者实现Keepalived双机热备 系统 ...

  8. keepalived mysql双主架构图_基于keepalived Mysql双主热备配置

    基于keepalived双主热备: 一.环境: OS:CentOS 6.5 X64 DB Version:Percona Mysql 5.7.15-9-log 路径:/app/mysql57 数据文件 ...

  9. keepalived mysql双主架构图_MySQL双机热备(keepalived+mysql双主)

    科普描述 双机热备是指两台机器都在运行, 但并不是两台机器都同时在提供服务. 当提供服务的一台 出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短. MySQL 双主复制,即互为 ...

最新文章

  1. VIM命令快速记忆(转自杰哥)
  2. python-子类和派生、继承
  3. 使用图形工具管理Server Core上的账号和组
  4. Coolite Cool Study 3 MVC + Coolite 的例子
  5. 电离辐射防护与辐射源安全基本标准_辐射防护与安全机考难点考点解析辐射防护标准...
  6. C++为什么摒弃auto_ptr
  7. drf5 版本和认证组件
  8. 云计算入门科普系列:云计算与人工智能
  9. FLEX4中的Panel如何实现带自定义图标和按钮
  10. 用sql写每年的第三周_SQL的弱点(1):复杂SQL不易理解,以及软件工程如何来帮忙...
  11. 免杀需要的基本汇编知识
  12. 学习node js 之微信公众帐号接口开发 准备工作
  13. A - 加农炮(线段树)单点更新
  14. 一个完整的计算器c语言源代码,分享一个C语言的计算器源代码
  15. 【学习笔记】Creo如何创建钣金件(利用骨架)
  16. python 数据预处理 毕设_python 数据预处理 毕设
  17. 阳光长跑(阳光体育服务平台)
  18. C++17新属性详解
  19. BUAA-2021春-数据结构-综合作业-文本摘要生成(Hash实现 + SIMD优化 终测最速)
  20. 本地文件共享到云服务器,本地文件共享到云服务器

热门文章

  1. python中字典的循环遍历的两种方式
  2. goland 提示doucment contains very longs line,引用包超大的问题
  3. Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255]
  4. 拼多多贴钱卖车,揭示汽车经销商现状
  5. Python_Task06:函数与Lambda表达式
  6. 学习全栈在线教育实战项目(尚硅谷) 第一天
  7. E470C触摸屏的关闭
  8. 【读书笔记】汇编语言程序设计
  9. 网络安全、安全服务、加密原理及加密流程
  10. ltspice语言中文_ltspice-一简介(中文教程).pdf