实验拓扑
主机名 | 主机地址 | 角色 |
---|---|---|
node1 | 192.168.2.201 | Master |
node2 | 192.168.2.202 | Slave |
node3 | 192.168.2.203 | Slave |
- 本文使用CentOS7.1,数据库:MariaDB-5.5.50
- 注意:本文关闭了selinux,以及iptables。
一、异步复制:
,从服务器需要开启中继日志
- binlog
。
- relay-log
的主要功能是:记录令数据库内容产生改变的语句,如
- binlog
语句;二进制日志在备份还原的时候至关重要。
- insert
则是从服务器中开启,作用是从主服务器的二进制日志中复制,并在在从服务器本地执行一次,达到与主服务器内容一致的效果。
- relay-log
- (1) 启动二进制日志;
- [mysqld]
- log_bin=mysql-bin
- (2) 为当前节点设置一个全局唯一的ID号;
- [mysqld]
- server_id=1
- (3) 授权创建仅有复制权限的用户账号;
- mysql> GRANT REPLCATION SLAVE, REPLICATION CLIENT ON *.* TO 'repuser'@'192.168.2.%' IDENTIFIED BY 'repuser';
- (4)查看Master端的二进制日志记录到哪里,用于决定Slave复制的起始位置
- MariaDB [(none)]> show master status;
- +-------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +-------------------+----------+--------------+------------------+
- | Master-log.000001 | 245 | | |
- +-------------------+----------+--------------+------------------+
- #Slave服务器如果是一个空的数据库而主服务器不为空:
- #在同步之前可以先用Master的全量备份,恢复到Slave数据库中。
- #然后再从备份那一刻记录的Position开始复制。
- #假设Master和Slave都为空,上面的情况就表示Slave从二进制日志Master-log.000001的245开始复制
- (1) 启动中继日志;
- [mysqld]
- relay_log=relay-log
- relay_log_index=relay-log.index
- (2) 为当前节点设置一个全局惟的ID号;
- [mysqld]
- server_id=2
- #node3把这里改为3
- (3) Slave服务器打开只读模式;
- [mysqld]
- read_only = 1
- (4) 使用有复制权限的用户账号连接至主服务器,并启动复制线程;
- #注意:上面的是在/etc/my.cnf的配置文件中添加,下面mysql>的则是在mysql服务器中运行的命令
- mysql> CHANGE MASTER TO
- MASTER_HOST='192.168.2.201',
- MASTER_USER='repuser',
- MASTER_PASSWORD='repuser',
- MASTER_LOG_FILE='Master-log.000001',
- MASTER_LOG_POS=245;
- (5)在从服务器中开启复制线程
- mysql> START SLAVE;
- mysql> show slave status\G
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.2.201
- Master_User: repuser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: Master-log.000003
- Read_Master_Log_Pos: 1379
- Relay_Log_File: relay-log.000002
- Relay_Log_Pos: 1414
- Relay_Master_Log_File: Master-log.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 1379
- Relay_Log_Space: 1702
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 0
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 1
- 1 row in set (0.00 sec)
- 插入几条命令之后,从以上的状态信息中可以看得到我们的Master服务器是192.168.2.201
- 拥有复制功能的账号是repuser,现在复制到Master-log.000003的Position 1379这个位置;
- 上面的输出结果中,我在复制完成之后使用了flush logs手动地滚动了二进制日志,所以二进制去到000003
二、半同步复制
(1)Master安装插件并修改变量:
- 由于上面已经进行了异步复制的配置,下面仅进行半同步复制的操作。
- mysql > INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
- 插件的文件名字和路径一般在rpm -ql mariadb-server那里查看。
- 这个插件的库文件是安装好之后就直接有的,只是没有默认安装。
- mysql > SET GLOBAL VARIABLES rpl_semi_sync_master_enabled = 1;
(1)slave安装插件并修改变量:
- mysql > INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
- mysql > SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled = 1;
- 这里需要注意的是,node1作为主节点使用的是master模块。node2,node3作为从节点使用slave模块
(2)查看半同步复制的全局变量
- mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
- +------------------------------------+-------+
- | Variable_name | Value |
- +------------------------------------+-------+
- | rpl_semi_sync_master_enabled | ON |
- | rpl_semi_sync_master_timeout | 10000 |
- | rpl_semi_sync_master_trace_level | 32 |
- | rpl_semi_sync_master_wait_no_slave | ON |
- +------------------------------------+-------+
- 设置rpl_semi_sync_master_enabled=1的效果
- 第一行是ON则表示半同步复制已经开启。
(3)查看半同步复制的全局变量
- mysql> SHOW GLOBAL STATUS LIKE '%semi%';
- +--------------------------------------------+-------+
- | Variable_name | Value |
- +--------------------------------------------+-------+
- | Rpl_semi_sync_master_clients | 1 |
- | Rpl_semi_sync_master_net_avg_wait_time | 645 |
- | Rpl_semi_sync_master_net_wait_time | 645 |
- | Rpl_semi_sync_master_net_waits | 1 |
- | Rpl_semi_sync_master_no_times | 1 |
- | Rpl_semi_sync_master_no_tx | 5 |
- | Rpl_semi_sync_master_status | ON |
- | Rpl_semi_sync_master_timefunc_failures | 0 |
- | Rpl_semi_sync_master_tx_avg_wait_time | 783 |
- | Rpl_semi_sync_master_tx_wait_time | 783 |
- | Rpl_semi_sync_master_tx_waits | 1 |
- | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
- | Rpl_semi_sync_master_wait_sessions | 0 |
- | Rpl_semi_sync_master_yes_tx | 1 |
- +--------------------------------------------+-------+
- 第一行Rpl_semi_sync_master_clients显示1,表示有一台主机是半同步复制的状态。
最后需要说明的是,semi复制的MySQL5.7中性能有明显的改善。
假如真的需要使用半同步复制,建议使用5.7的版本。
下一篇文章,我们将会讲怎么使用MHA配合半同步复制高可用MariaDB,见 http://www.linuxidc.com/Linux/2017-10/147555.htm
来源: http://www.linuxidc.com/Linux/2017-10/147554.htm