keepalive半同步双主一从
ip地址如下:
192.168.20.201 redis01 主 192.168.20.202 redis02 主 192.168.20.203 redis03 从 192.168.20.205 vip
修改my.cnf配置文件如下
[root@redis01 keepalived]# cat /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-bin gtid_mode = ON enforce_gtid_consistency = ON master_info_repository =TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON binlog_format=ROW log_timestamps= SYSTEM #Group Replication Settings plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" rpl-semi-sync-master-enabled = 1 rpl-semi-sync-slave-enabled = 1 slave_parallel_type=database slave_parallel_workers=3 #GENERAL datadir=/data/mysql socket=/data/mysql/mysql.sock pid-file=/data/mysqld.pid user=mysql port=3306 default_storage_engine=InnoDB #INNODB innodb_buffer_pool_size = 512M innodb_log_file_size=10M innodb_file_per_table=1 innodb_flush_method=O_DIRECT #MYISAM key_buffer_size=10M #LOGGING log-error=/data/log/mysql-error.log slow_query_log=1 #是否启用慢查询日志,1为启用,0为禁用 slow_query_log_file=/data/log/mysql-slow.log #指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datad #OTHER tmp_table_size=32M max_heap_table_size=32M #query_cache_type=0 #query_cache_size=0 max_connections=1000 thread_cache_size=100 #table_cache=100 open_files_limit=65535 [client] #socket=/var/lib/mysql/mysql.sock socket=/data/mysql/mysql.sock port=3306 user=root password=ocm123 其他节点修改server-id的值
创建复制用户及授权,3个节点都需要创建
create user 'repl'@'192.%' identified by 'ocm123'; GRANT replication slave ON *.* to repl@'192.%' IDENTIFIED BY 'ocm123';
安装及配置keepalived
yum install keepalived-1* 先备份配置文件 cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak 修改配置文件如下,修改前保证防火墙已关掉,或者在/etc/sysconfig/iptables加入以下条目 -A INPUT -d 192.168.20.205 -j ACCEPT 配置keepalived为backup模式,master挂掉以后,vip切换到backup(redis02)主机,当master(redis01)主机启动以后不会抢回vip,从机redis03不会在切换一次 主机redis01 [root@redis01 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id MYSQL-HA } vrrp_script chk_mysql_port { script "/etc/keepalived/check.sh" interval 2 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP priority 150 nopreempt interface eth1 virtual_router_id 51 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.20.205 } track_script { chk_mysql_port } } 主机redis02 [root@redis02 keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id MYSQL-HA } vrrp_script chk_mysql_port { script "/etc/keepalived/check.sh" interval 2 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP priority 50 nopreempt interface eth5 virtual_router_id 51 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.20.205 } track_script { chk_mysql_port } } mysql监控脚本如下 [root@redis02 keepalived]# cat check.sh #!/bin/bash counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then /etc/init.d/keepalived stop fi
配置复制
change master to master_host='redis01', master_user='repl', master_password='ocm123', master_auto_position=150; change master to master_host='redis02', master_user='repl', master_password='ocm123', master_auto_position=150; change master to master_host='192.168.20.205', master_user='repl', master_password='ocm123', master_auto_position=150;
验证vip切换
查看ip [root@redis01 sysconfig]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1 valid_lft forever preferred_lft forever inet 192.168.20.205/32 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fead:6996/64 scope link valid_lft forever preferred_lft forever 在redis03上查看vip在那个主机上 [root@redis03 ~]# ssh 192.168.20.205 hostname redis01 关掉redis01上mysql [root@redis01 sysconfig]# /etc/init.d/mysqld stop Stopping mysqld: [ OK ] [root@redis01 sysconfig]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fead:6996/64 scope link valid_lft forever preferred_lft forever [root@redis03 ~]# ssh 192.168.20.205 hostname redis02 结论 redis01上mysql会自动关闭keepalived,vip切换到redis02上 启动redis01上mysql及keepalived看vip是否会切回redis01 [root@redis01 sysconfig]# /etc/init.d/mysqld start Starting mysqld: [ OK ] [root@redis01 sysconfig]# /etc/init.d/keepalived start Starting keepalived: [ OK ] [root@redis01 sysconfig]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fead:6996/64 scope link valid_lft forever preferred_lft forever [root@redis03 ~]# ssh 192.168.20.205 hostname redis02 从上面得出结论,redis01启动mysql以后不会抢回vip
查看从机redis03上复制状态
mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.20.205 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 230 Relay_Log_File: redis03-relay-bin.000074 Relay_Log_Pos: 435 Relay_Master_Log_File: mysql-bin.000005 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: 230 Relay_Log_Space: 921 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: 2 Master_UUID: e1ce6245-b4a3-11e8-9ecc-08002771e31b Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54, e1ce6245-b4a3-11e8-9ecc-08002771e31b:1 Executed_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54, e1ce6245-b4a3-11e8-9ecc-08002771e31b:1 Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) mysql> select * from mysql.slave_master_info \G *************************** 1. row *************************** Number_of_lines: 25 Master_log_name: mysql-bin.000005 Master_log_pos: 230 Host: 192.168.20.205 User_name: repl User_password: ocm123 Port: 3306 Connect_retry: 60 Enabled_ssl: 0 Ssl_ca: Ssl_capath: Ssl_cert: Ssl_cipher: Ssl_key: Ssl_verify_server_cert: 0 Heartbeat: 30 Bind: Ignored_server_ids: 0 Uuid: e1ce6245-b4a3-11e8-9ecc-08002771e31b Retry_count: 86400 Ssl_crl: Ssl_crlpath: Enabled_auto_position: 1 Channel_name: Tls_version: 1 row in set (0.00 sec) mysql> select * from mysql.slave_relay_log_info\G *************************** 1. row *************************** Number_of_lines: 7 Relay_log_name: ./redis03-relay-bin.000073 Relay_log_pos: 435 Master_log_name: mysql-bin.000016 Master_log_pos: 230 Sql_delay: 0 Number_of_workers: 3 Id: 1 Channel_name: 1 row in set (0.00 sec) mysql> select * from mysql.slave_worker_info \G *************************** 1. row *************************** Id: 1 Relay_log_name: ./redis03-relay-bin.000005 Relay_log_pos: 730 Master_log_name: mysql-bin.000001 Master_log_pos: 1349594 Checkpoint_relay_log_name: ./redis03-relay-bin.000005 Checkpoint_relay_log_pos: 438 Checkpoint_master_log_name: mysql-bin.000001 Checkpoint_master_log_pos: 1349302 Checkpoint_seqno: 0 Checkpoint_group_size: 64 Checkpoint_group_bitmap: Channel_name: *************************** 2. row *************************** Id: 2 Relay_log_name: Relay_log_pos: 0 Master_log_name: Master_log_pos: 0 Checkpoint_relay_log_name: Checkpoint_relay_log_pos: 0 Checkpoint_master_log_name: Checkpoint_master_log_pos: 0 Checkpoint_seqno: 0 Checkpoint_group_size: 64 Checkpoint_group_bitmap: Channel_name: *************************** 3. row *************************** Id: 3 Relay_log_name: ./redis03-relay-bin.000002 Relay_log_pos: 910010 Master_log_name: mysql-bin.000001 Master_log_pos: 909805 Checkpoint_relay_log_name: ./redis03-relay-bin.000002 Checkpoint_relay_log_pos: 555275 Checkpoint_master_log_name: mysql-bin.000001 Checkpoint_master_log_pos: 555070 Checkpoint_seqno: 0 Checkpoint_group_size: 64 Checkpoint_group_bitmap: Channel_name: 3 rows in set (0.00 sec)