Atlas+keepalived+mysql(实现HA+主从同步)
使用KeepAlived实现服务进程HA的安装配置

使用KeepAlived实现服务进程HA的安装配置使用HA方案的背景对于可以实现集群的服务,我们可以将同一功能的多个实例部署在不同的机器上,避免设备单点故障。
但是,有些系统级别的进程,却不允许运行多实例,例如一个普通的统计服务,这个服务的功能是主动轮询规则后进行统计。
在这种情况下,如果不进行规则适配改造,运行多个统计服务实例,那么,每个实例都将统计一遍数据,暂且不考虑对服务器的消耗,多个实例将产生多份数据,造成统计结果错误。
特别的,对于很多已经存在的服务进程,都无法实现多实例部署。
在这种情况下,这种服务只能是单进程的,如果这台机器由于硬件故障的话,服务将中断。
因此,有必要研究另外一种方案,实现服务进程的异地备份,在服务机器出现故障时,能够最快速的在另外一台备份机器上运行起来。
这种方案就属于冷备方案,也叫HA方案。
对于冷备方案,将不可避免的中断服务,但是,中断服务的时间长短是整个方案的关键,使用KeepAlived,配合增加进程的守护,将极大的缩短故障恢复时间。
故障的时长基本上等于服务进程的启动时长。
HA方案流程1.在主机和备机上安装好KeepAlived软件,服务对外使用虚拟IP。
2.在主机和备机上安装好能正常使用的程序。
3.在主机和备机上安装好进程监控程序,在主备机切换时,监控程序将服务启动起来。
4.实现主机和备机的程序同步功能,防止日常维护造成两边程序文件的不一致。
在本方案中,KeepAlived只提供主机的虚拟IP自动映射功能,不提供任何业务逻辑。
所有的业务逻辑都是通过自己编写的进程监控程序来实现,也就是说,监控程序一直在运行中,当发现虚拟IP切换后,将相关的服务进行启动或停止操作。
KeepAlived的安装配置KeepAlived的安装、启动、停止都是在root用户下,因此,本章节的所有操作都是在root用户下操作。
另外,本安装包都是针对linux x64机器,如果是其他操作系统,原理相同,但安装包要自行解决。
详解MySQL双活同步复制四种解决方案

详解MySQL双活同步复制四种解决⽅案⽬录对于数据实时同步,其核⼼是需要基于⽇志来实现,是可以实现准实时的数据同步,基于⽇志实现不会要求数据库本⾝在设计和实现中带来任何额外的约束。
基于MySQL原⽣复制主主同步⽅案这是常见的⽅案,⼀般来说,中⼩型规模的时候,采⽤这种架构是最省事的。
两个节点可以采⽤简单的双主模式,并且使⽤专线连接,在master_A节点发⽣故障后,应⽤连接快速切换到master_B节点,反之也亦然。
有⼏个需要注意的地⽅,脑裂的情况,两个节点写⼊相同数据⽽引发冲突,同时把两个节点的auto_increment_increment(⾃增步长)和auto_increment_offset(⾃增起始值)设成不同值。
其⽬的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应⽤,从⽽会导致slave新写⼊数据的⾃增值和原先master上冲突了,因此⼀开始就使其错开;当然了,如果有合适的容错机制能解决主从⾃增ID冲突的话,也可以不这么做,使⽤更新的数据版本5.7+,可以利⽤多线程复制的⽅式可以很⼤程度降低复制延迟,同时,对复制延迟特别敏感的另⼀个备选⽅案,是semi-sync半同步复制,基本上⽆延迟,不过事务并发性能会有不⼩程度的损失,特别是在双向写的时候,需要综合评估再决定。
基于Galera replication⽅案Galera是Codership提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务⾼可⽤及数据⼀致性,基于Galera的⾼可⽤⽅案主要有MariaDB Galera Cluster和Percona XtraDB Cluster(简称PXC)。
⽬前PXC⽤的会⽐较多⼀些,数据严格⼀致性,尤其适合电商类应⽤,不过PXC也是有其局限性的,如果并发事务量很⼤的话,建议采⽤InfiniBand⽹络,降低⽹络延迟,因为PXC存在写扩⼤以及短板效应,并发效率会有较⼤损失,类似semi-sync半同步复制,Gelera实际只能⽤三个节点,⽹络抖动造成的性能和稳定性习惯性问题基于Group Replication⽅案通过Paxos协议提供数据库集群节点数据强⼀致保证,MGR准确来说是MySQL官⽅推出的⾼可⽤解决⽅案,基于原⽣复制技术,并以插件的⽅式提供,并且集群间所有节点可写⼊,解决了单个集群的写⼊性能,所有节点都能读写,解决⽹络分区导致的脑裂问题,提升复制数据的可靠性,不过现实还是有些残酷,⽬前尝鲜的并不是很多,同时仅⽀持InnoDB表,并且每张表⼀定要有⼀个主键,⽤于做write set的冲突检测,必须打开GTID特性,⼆进制⽇志格式必须设置为ROW,⽤于选主与write setCOMMIT可能会导致失败,类似于快照事务隔离级别的失败场景,⽬前⼀个MGR集群最多⽀持9个节点,不⽀持外键于save point特性,⽆法做全局间的约束检测与部分部分回滚,⼆进制⽇志不⽀持binlog event checksum基于canal⽅案对于数据库的实时同步,阿⾥巴巴专门有⼀个开源项⽬,即otter来实现分布式数据库的同步复制,其核⼼思想仍然是通过获取数据库的增量数据⽇志,来进⾏准实时的同步复制。
使用keepalived实现对mysql主从复制的主备自动切换

keepalived实现对mysql主从复制的主备自动切换使用MySQL+keepalived是一种非常好的解决方案,在MySQL-HA环境中,MySQL 互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。
实验环境中用两台主机搭建了一个mysql主从复制的环境,两台机器分别安装了keepalived,用一个虚IP实现mysql服务器的主备自动切换功能.模拟环境:VIP:192.168.1.197 :虚拟IP地址Master:192.168.1.198 :主数据库IP地址Slave:192.168.1.199 :从数据库IP地址备注:MySQL的主从同步配置不在此文档中说明(前提:主从同步已完成)安装步骤:1、keepalived的安装Yum install -y keepalivedChkconfig keepalived on2、keepalived.conf文件的配置Master:keepalived.confvi /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {kenjin@}notification_email_from kenjin@smtp_connect_timeout 3smtp_server router_id MySQL-ha}vrrp_script check_run { #声明vrrp_script 的函数check_run script "/root/keepalived_check_mysql.sh" #监控MySQL的脚本interval 5}vrrp_sync_group VG1 {group {VI_1}}vrrp_instance VI_1 {state MASTER #指定主服务器节点为主节点,备用节点上设置需一致interface eth0 #指定虚拟IP的网络接口virtual_router_id 88 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低。
数据库主从同步配置MySql数据双向同步配置的方法

数据库主从同步配置MySql数据双向同步配置的方法配置MySQL数据库的主从同步可以实现数据的双向同步,以下是一种常见的配置方法:1. 确保两台MySQL服务器之间能够互相访问,比如在操作系统级别上配置好网络和防火墙规则。
2. 在主服务器上,编辑MySQL配置文件(f或my.ini),找到并修改以下几个参数:```server-id = 1 #设置服务器唯一ID,主服务器设为1,从服务器设为不同的值log_bin = mysql-bin #开启二进制日志记录功能binlog_format = row #设置二进制日志的格式为行级格式```3. 在主服务器上重启MySQL服务,使配置生效。
4. 在主服务器上创建一个专门用于主从同步的账号,并授予对应的权限。
比如创建一个账号名为replication的账号,并为其授予REPLICATION SLAVE权限:```sqlCREATE USER 'replication'@'从服务器IP' IDENTIFIED BY '密码';GRANT REPLICATION SLAVE ON *.* TO 'replication'@'从服务器IP';FLUSH PRIVILEGES;```5. 在从服务器上,编辑MySQL配置文件(f或my.ini),找到并修改以下几个参数:```server-id = 2 #设置服务器唯一ID,主服务器设为1,从服务器设为不同的值 log_bin = mysql-bin #开启二进制日志记录功能binlog_format = row #设置二进制日志的格式为行级格式```6. 在从服务器上重启MySQL服务,使配置生效。
7. 在从服务器上执行以下命令,配置主从关系:```sqlCHANGE MASTER TOMASTER_HOST ='主服务器IP',MASTER_PORT = 主服务器端口号,MASTER_USER ='replication',MASTER_PASSWORD ='密码',MASTER_LOG_FILE ='主服务器当前二进制日志文件名',MASTER_LOG_POS = 主服务器当前二进制日志位置;```8. 在从服务器上启动从服务器的复制进程:```sqlSTART SLAVE;```9. 在主服务器上执行以下命令,查看主从同步状态:```sqlSHOW MASTER STATUS;```10. 在从服务器上执行以下命令,查看主从同步状态:```sqlSHOW SLAVE STATUS;```以上是一种常见的MySQL数据库主从同步配置方法,根据实际情况可能还需要进行其他配置和调优。
MYSQL数据库如何设置主从同步

MYSQL数据库如何设置主从同步⽬录1、配置主数据库2、配置从数据库总结MYSQL可以配置1个主数据库多个从数据库1、配置主数据库主master : 192.168.1.132从slave : 192.168.1.1331)授权给从数据库GRANT REPLICATION SLAVE ON *.* to 'repl'@'192.168.1.132' identified by 'test123456';FLUSH PRIVILEGES;2)修改主库配置⽂件,开启binlog,并设置server-id,每次修改配置⽂件后都要重启mysql服务才会⽣效vim /etc/fserver-id:master端的ID号;log-bin:同步的⽇志路径及⽂件名,这个⽬录要是mysql有权限写⼊的;binlog-do-db:要同步的数据库名3)授权chown mysql:mysql -R /usr/local/mysql_data4)重启服务:service mysqld restart5)输⼊下⽅语句show master status;2、配置从数据库1)设置从数据库配置vi /etc/fserver-idreplicate-do-db=world2)添加主数据库的地址、端⼝号、同步⽤户、密码、log⽂件、⽂件起始位置。
3)删除fcd /usr/local/mysql_data/rm -rf f(不删除会同步不成功)4)启动从数据库主从show slave status5) 在主数据插⼊数据,从数据就是同步数据。
总结到此这篇关于MYSQL数据库如何设置主从同步的⽂章就介绍到这了,更多相关MYSQL主从同步内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
配置Mysql数据库的主从同步教程

配置Mysql数据库的主从同步教程主从同步是实现网站分布式数据处理一个非常常用的方案了,今天我来为各位介绍配置Mysql数据库的主从同步(双主)教程,希望下文能帮助到各位哦.配置Mysql数据库的主从同步(一主一从).一、主库开启BINLOG、server-id[root@Master-Mysql ~]# grep -E "server-id|log-bin" /etc/flog-bin = /usr/local/mysql/data/mysql-binserver-id = 1mysql> show variables like '%log_bin%';+---------------------------------+---------------------------------------+| Variable_name | Value |+---------------------------------+---------------------------------------+| log_bin | ON || log_bin_basename | /usr/local/mysql/data/mysql-bin || log_bin_index | /usr/local/mysql/data/mysql-bin.index || log_bin_trust_function_creators | OFF || log_bin_use_v1_row_events | OFF || sql_log_bin | ON |+---------------------------------+---------------------------------------+6 rows in set (0.01 sec) mysql> show variables like '%server_id%';+----------------+-------+| Variable_name | Value |+----------------+-------+| server_id | 1 || server_id_bits | 32 |+----------------+-------+2 rows in set (0.00 sec)备注:以上两个信息必须在[mysqld]模块下!!!二、给从库授权mysql> grant replication slave on *.* to byrd@'192.168.199.%' identified by 'admin';mysql> flush privileges;mysql> select user,host from er;+------+---------------+| user | host |+------+---------------+| root | 127.0.0.1 || byrd | 192.168.199.% || root | ::1 || root | lamp || root | localhost |+------+---------------+5 rows in set (0.00 sec)锁表前建立点数据:mysql> create database hitest;mysql> show databases;+--------------------+| Database |+--------------------+| hitest |+--------------------+6 rows in set (0.00 sec)mysql> use hitest;mysql> create table test(-> id int(4) not null primary key auto_increment,-> name char(20) not null-> );Query OK, 0 rows affected (1.80 sec)mysql> show tables ;+------------------+| Tables_in_hitest |+------------------+| test |+------------------+mysql> insert into test(id,name) values(1,'zy'); mysql> select * from test;+----+------+| id | name |+----+------+| 1 | zy |+----+------+三、锁表、备份、解锁mysql> flush table with read lock; #锁表mysql> show variables like '%timeout%'; #锁表时间+-----------------------------+----------+| Variable_name | Value |+-----------------------------+----------+| interactive_timeout | 28800 || wait_timeout | 28800 |+-----------------------------+----------+12 rows in set (0.06 sec)mysql> show master status; #binlog日志位置+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000004 | 1305 | | | | +------------------+----------+--------------+------------------+-------------------+1 row in set (0.03 sec)[root@Master-Mysql ~]# /usr/local/mysql/bin/mysqldump -uroot -p'' -B -A |gzip >/tmp/all.sql.gz #新窗口备份Enter password:mysql> unlock table; #解锁###############解锁后主库操作如下:###############mysql> use hitestmysql> insert into test(id,name) values(2,'binghe');mysql> select * from test;+----+--------+| id | name |+----+--------+| 1 | zy || 2 | binghe |+----+--------+mysql> create database hxy;###############解锁后主库操作完成~###############备注:备份数据需要重新打开新窗口,不然锁表就自动失效.四、主库导入到从库################主库操作################[root@Master-Mysql tmp]# ll-rw-r--r--. 1 root root 162236 Jul 8 21:30 all.sql.gz[root@Master-Mysql tmp]# gzip -d all.sql.gz[root@Master-Mysql tmp]# ll-rw-r--r--. 1 root root 590351 Jul 8 21:30 all.sql################主库完成##################备注:将主库导出的all.sql通过scp、ssh、sftp等方式拷贝到从库服务器,此处略## [root@Slave-Mysql ~]# grep log-bin /etc/f#log-bin = /usr/local/mysql/data/mysql-bin[root@Slave-Mysql ~]# grep server-id /etc/fserver-id = 2[root@Slave-Mysql ~]# /etc/init.d/mysqld restart[root@Slave-Mysql tmp]# /usr/local/mysql/bin/mysql -uroot -p'admin' </tmp/all.sqlWarning: Using a password on the command line interface can be insecure.[root@Slave-Mysql tmp]# /usr/local/mysql/bin/mysql -uroot -p'admin'mysql> use hitest;mysql> select * from test;+----+------+| id | name |+----+------+| 1 | zy |+----+------+1 row in set (0.00 sec)六、从库配置信息mysql> CHANGE MASTER TO-> MASTER_HOST='192.168.199.177',-> MASTER_PORT=3306,-> MASTER_USER='byrd',-> MASTER_PASSWORD='admin',-> MASTER_LOG_FILE='mysql-bin.000004',-> MASTER_LOG_POS=1305;Query OK, 0 rows affected, 2 warnings (1.96 sec)[root@Slave-Mysql ~]# ll /usr/local/mysql/data/##备注:记录MASTER的相关信息!七、启动从库同步mysql> start slave;mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 0八、结果测试mysql> use hitest;mysql> select * from test;+----+--------+| id | name |+----+--------+| 1 | zy || 2 | binghe |+----+--------+2 rows in set (0.00 sec)[root@Master-Mysql ~]# /usr/local/mysql/bin/mysql -uroot -p'' -e "create database zhihu;" #主库建立了一个zhihu的数据库Enter password:[root@Slave-Mysql ~]# /usr/local/mysql/bin/mysql -uroot -p'' -e "show databases like 'zhihu'"; Enter password:+------------------+| Database (zhihu) |+------------------+| zhihu |+------------------+配置Mysql数据库的主从同步(双主)已经配置好的:主库:192.168.199.177从库:192.168.199.178[root@Master-Mysql ~]# egrep "server-id|log-slave|log-bin|auto_increment|slave-skip-errors" /etc/flog-bin = /usr/local/mysql/data/mysql-bin #必须server-id = 1 #必须log-slave-updates #必须auto_increment_increment = 2 #必须auto_increment_offset = 1 #必须slave-skip-errors = 1032,1062,1007 #非必须,建议########################主库、从库分隔符########################[root@Slave-Mysql data]# egrep "server-id|log-slave|log-bin|auto_increment|slave-skip-errors|read-only" /etc/f#log-bin = /usr/local/mysql/data/mysql-binserver-id = 2log-slave-updateslog-bin = /usr/local/mysql/data/mysql-bin#read-only #双主,此选项要注释掉slave-skip-errors = 1032,1062,1007auto_increment_increment = 2 #ID自增间隔auto_increment_offset = 2 #ID初始位置192.168.199.178:mysql> stop slave;mysql> flush table with read lock;mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000004 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+mysql> system /usr/local/sql/bin/mysqldump -uroot -p'' -A -B >/tmp/192.168.199.178.sql #如果主、从一致非必须mysql> unlock tables; #同上mysql> system ls -l /tmp/-rw-r--r--. 1 root root 2887406 Jul 12 22:24 192.168.199.178.sqlmysql> start slave;192.168.199.177:[root@Master-Mysql ~]# /usr/local/mysql/bin/mysql -uroot -p'' < /tmp/192.168.199.178.sql #如果主、从一致非必须mysql> update er set password=PASSWORD('admin') where user='root';[root@Master-Mysql ~]# cat |/usr/local/mysql/bin/mysql -uroot -p'admin' <<EOF #必须> CHANGE MASTER TO> MASTER_HOST='192.168.199.178',> MASTER_PORT=3306,> MASTER_USER='byrd',> MASTER_PASSWORD='admin',> MASTER_LOG_FILE='mysql-bin.000004',> MASTER_LOG_POS=120;> EOFmysql> start slave;mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.199.178Master_User: byrdMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 938Relay_Log_File: mysqld-relay-bin.000002Relay_Log_Pos: 1101Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesLast_Errno: 0Skip_Counter: 0Exec_Master_Log_Pos: 938Relay_Log_Space: 1275Until_Condition: NoneUntil_Log_Pos: 0Master_SSL_Allowed: NoSeconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_SQL_Errno: 0Master_Server_Id: 2Master_UUID: 34d672c3-d292-11e3-9ff5-00155dc7834cMaster_Info_File: /usr/local/mysql/data/SQL_Delay: 0 SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update itMaster_Retry_Count: 86400测试:192.168.199.177:mysql> use hitest;mysql> CREATE TABLE `ces` (-> `REL_ID` bigint(12) NOT NULL auto_increment COMMENT 'id',-> `TITLE` varchar(255) NOT NULL COMMENT 'biaoti',-> PRIMARY KEY (`REL_ID`)-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;mysql> insert into ces(TITLE) values('test');mysql> insert into ces(TITLE) values('test');mysql> insert into ces(TITLE) values('test');mysql> insert into ces(TITLE) values('test25');mysql> select * from ces;+--------+-------+| REL_ID | TITLE |+--------+-------+| 1 | test || 3 | test || 5 | test || 25 | test25|+--------+--------+3 rows in set (0.03 sec)192.168.199.178:mysql> use hitest;mysql> insert into ces(TITLE) values('test26');mysql> insert into ces(TITLE) values('test28');mysql> insert into ces(TITLE) values('test30');mysql> select * from ces;+--------+--------+| REL_ID | TITLE |+--------+--------+| 1 | test || 3 | test || 5 | test || 26 | test26 || 28 | test28 || 30 | test30 |+--------+--------+17 rows in set (0.00 sec)说明:如果一主、一丛已经做好,只要知道从库位置点(show master status;)、然后之前主库执行(CHANGE MASTER)、之前主库开启slave(start slave)即可,其中数据库备份等步骤可以省略,如果主从有一些数据库不一致则同上操作.。
mysql 主从同步的原理

mysql 主从同步的原理
MySQL主从同步是一种数据库备份和复制的方式,能够将一个MySQL主服务器上的数据自动同步到一台或多台MySQL从服务器上,使得从服务器上的数据与主服务器上的数据保持同步。
其原理主要基于MySQL的二进制日志复制机制。
实现主从同步的基本流程如下:
1.主服务器将所有的数据更改都记录到二进制日志中;
2.从服务器连接主服务器,并请求从主服务器获取日志文件及日志文件中指定位置之后的日志记录;
3.主服务器向从服务器发送请求的日志记录,从服务器将其添加到从服务器的中继日志(relay log)中;
4.从服务器读取中继日志中的数据更新到本地数据库中。
在这个过程中,主服务器上的二进制日志起到了记录每个数据更改的作用,而从服务器通过读取主服务器上的二进制日志实现数据同步。
其中,主从服务器之间的数据传输基于MySQL自带的网络协议完成。
通过采用主从同步的方式,可以将数据备份和复制的任务分离,提高数据的可靠性和可扩展性。
keepalived+mysql构建主从HA架构全过程,附配置文件

keepalived+mysql构建主从HA架构全过程,附配置⽂件我没去公司之前,公司⼀直都是单节点mysql,且mysql的版本和安装⽅式配置⽂件等也不具有统⼀化,初期做了数据库的基础调整,就是做了mysql的默认架构,主从复制,跑了半年,⼀切稳定,为了更加的提升⾃⼰,只能多打打⼩怪兽,持续升级了,否则很快对⼀家公司你就没有特别⼤的利⽤价值,也没有加薪的空间,废话不多说,说⼀下我的部署架构。
⽬前所要构建HA架构的mysql是mysql 5.7版本,数据量极少,⼏⼗M,⽬前没有做MHA的架构需求,和⽼板讨论,加之研究了keepalived+mysql的HA架构,决定⼀试。
⼀.⽬前架构和keepalived+mysql的HA架构和MHA架构的对⽐优势:搭建⽐较简单,只需要主从安装keepalived的服务,启动vip即可以实现。
劣势:1.主从只可以实现⼀次切换,切换后,之前的主库,即使重启也⽆法直接使⽤,因为主从数据不⼀致,⽽需要⼿动创建主从,⽽这个过程可能遇到各种奇葩的问题,需要时间重新构建主从。
2.当主从不同步,此时进⾏主从切换,可能会出现,数据丢失的惨况。
3.受⼀些因素的影响,可能会出现脑裂,⽐如VIP两台服务器都没有,或者同时出现。
⼆.搭建过程1.ip分配如下2.构建mysql主从略。
正常的构建主从,基于GTID配置⽂件:主:[root@im_prod_master ~]# cat /etc/f[mysqld]#************** basic ***************user=mysqlbasedir=/usr/local/mysqldatadir=/data/mysqllog-error=/var/log/mysql.loglog_bin=/data/mysql/binlog/mysql-binserver-id=162sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION skip-name-resolvegtid-mode=onenforce-gtid-consistency=truedefault_storage_engine=InnoDBdefault_tmp_storage_engine=InnoDBinternal_tmp_disk_storage_engine=InnoDBautocommit=1log_timestamps=SYSTEM##***********binlog & relaylog&slow log**************binlog_format=rowbinlog_cache_size=128kbinlog_stmt_cache_size=128kmax_binlog_cache_size=2Gmax_binlog_stmt_cache_size=2Glog-bin-trust-function-creators=1expire_logs_days=7max_binlog_size=500Mslow_query_log=1slow_query_log_file=/data/mysql/slowlog/slow.loglong_query_time=2log_queries_not_using_indexes=ONrelay_log_recovery=ONskip-slave-startlog-bin-trust-function-creators=1##************character set ********************character_set_server=utf8mb4character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_general_ci##skip-grant-tables##***********slave config************************log-slave-updates=1##************system*****************************key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 16query_cache_size = 0query_cache_type = OFF[mysql]socket=/tmp/mysql.sock从:[mysqld]#************** basic ***************user=mysqlbasedir=/usr/local/mysqldatadir=/data/mysqllog-error=/var/log/mysql.loglog_bin=/data/mysql/binlog/mysql-binserver-id=161sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION skip-name-resolvegtid-mode=onenforce-gtid-consistency=truedefault_storage_engine=InnoDBdefault_tmp_storage_engine=InnoDBinternal_tmp_disk_storage_engine=InnoDBautocommit=1log_timestamps=SYSTEM##binlog & relaylogbinlog_cache_size=128kbinlog_stmt_cache_size=128kmax_binlog_cache_size=2Gmax_binlog_stmt_cache_size=2Gbinlog_format=rowexpire_logs_days=7max_binlog_size=500Mslow_query_log=1slow_query_log_file=/data/mysql/slowlog/slow.loglong_query_time=2log_queries_not_using_indexes=ONrelay_log_recovery=ONskip-slave-startlog-bin-trust-function-creators=1##************character set ********************character_set_server=utf8mb4character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_general_ci#skip-grant-tables#***********slave config************************log-slave-updates=1#read_only=1##************system*****************************key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 16query_cache_limit = 1Mquery_cache_size = 16M[mysql]socket=/tmp/mysql.sock3.安装keepalivedyum install -y keepalived 也可以源码安装編輯keepalived的配置⽂件:主:[root@im_prod_master ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id HA_MySQL ###定义⼀个全局变量}vrrp_script check_mysql {script "/server/scripts/check_mysql.sh" ####监控脚本interval 2}vrrp_instance V1_1 { ####实例名称(主备⼀致)state BACKUP #####主备必须都是backupinterface ens160 #####⽹卡信息virtual_router_id 162 #####路由ID主备必须⼀致,否则会出现脑裂priority 100 ####优先级advert_int 1 #检查间隔,默认1秒 VRRP⼼跳包的发送周期,单位为s 组播信息发送间隔nopreempt ###设置为不抢占两个节点的state都必须配置为BACKUP两个节点都必须加上配置 nopreempt authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.2.22.80 ###设置vip}}track_script {check_mysql ###指定检查脚本,定期运⾏它们来改变优先级,并最终引发主备交换}virtual_server 10.2.22.80 3306 {delay_loop 2 #健康检查间隔时间lb_algo wrr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh wrr加权轮询算法lb_kind DR #负载均衡转发规则NAT|DR|RUNpersistence_timeout 60 #会话保持时间protocol TCP ##使⽤协议real_server 10.2.22.162 3306 {notify_down /server/scripts/kill_keepalived.sh ###keepalived⾃杀脚本TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}}.........從:! Configuration File for keepalivedglobal_defs {router_id HA_MySQL}vrrp_script check_mysql {script "/server/scripts/check_mysql.sh"interval 2}vrrp_instance V1_1 {state BACKUPinterface ens160virtual_router_id 162priority 90advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.2.22.80}}track_script {check_mysql}virtual_server 10.2.22.80 3306 {delay_loop 2lb_algo wrrlb_kind DRpersistence_timeout 60protocol TCPreal_server 10.2.22.161 3306 {notify_down /server/scripts/kill_keepalived.shTCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}}附:配置⽂件 check_mysql.shMYSQL=/usr/local/mysql/bin/mysqlMYSQL_HOST=localhostMYSQL_USER=rootMYSQL_PASSWORD=1qaz@WSX$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/root/check_mysql.logif [ $? == 0 ]thenecho " $host mysql login successfully "exit 0elsesystemctl stop keepalived.serviceexit 2fi[root@im_prod_master ~]# cat /server/scripts/kill_keepalived.sh#!/bin/bashkill -9 $(cat /var/run/keepalived.pid)3.切换测试1). ⾸先kill掉主库,查看ip是否会漂移因为测试时候未截图,但是依以上配置,可以实现vip漂移,并且访问正常,⽆中断2).挂掉主库恢复⾸先将挂掉的主库启动,reset master;reset slave;change master to master_host='10.2.22.161',master_user='repl',master_password='123456' ,MASTER_AUTO_POSITION=1;start slave;show slave status\G;如果正常,就没问题了,如果不正常,建议,直接重新初始化数据库,重新构建和新主库的主从关系,从新主库备份的命令:/usr/local/mysql/bin/mysqldump -uroot -p'1qaz@WSX' -h10.2.22.161 --single-transaction --triggers --set-gtid-purged=ON --routines --events --master-data=2 -A |gzip > $path/im_prod/all_${ttime}.sql.gz。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
A tlas+lvs+keepalived +mysql+主从复制负载均衡搭建部署文档2015-8-31(V1.0)一、部署背景信息基于mysql的负载均衡有很多种方式,如haproxy,前面一篇博客有介绍,还可以用更高效lvs 做负载均衡,下面是基于percona xtradb cluster的三个节点的多主复制+atlas的lvs负载均衡,其实这里是不需要用atlas的,因为atlas是用来做连接池和读写分离的,而多主架构是不需要读写分离的(如果是基于mysql replication的就需要atlas做负载均衡了),但为了测试atlas能不能用lvs做负载均衡,就顺便做了下实验。
1.节点规划1.1 mysql数据节点:db169db172db173三个节点为xtradb cluster节点。
1.2 keepalived节点:db162db163虚拟ip为192.168.1.201haproxy节点(仅为了对比lvs的性能才安装的):db169(部署在xtradb cluster的一个节点上)1.3 atlas节点:和xtradb cluster节点部署在一起,也为三个节点注意:atlas和mysql要部署在一个节点上,如果不在一个节点上则不能用lvs dr模式负载均衡1.4 客户端测试节点:db55ip地址为192.168.1.* ,节点名为db+ip地址末位2.安装lvs及keepavlied(db162、db163上)2.1安装依赖包yum -y install kernel-devel make gcc openssl-devel libnl*下载并连接linux kernel文件,注意版本要一致(uname -a)[root@db163 ~]# ln -s /usr/src/kernels/2.6.32-358.el6.x86_64/ /usr/src/linux安装keepalived、lvs[root@db162 ~]# yum install ipvsadm[root@db162 ~]# yum install keepalived[root@db163 ~]# yum install ipvsadm[root@db163 ~]# yum install keepalived2.2.配置keepavlied,注意lvs不需要单独配置,在keepalived里配置就行了[root@db162 ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id MySQL_LB1}vrrp_sync_group VSG {group {MySQL_Loadblancing}}vrrp_instance MySQL_Loadblancing { state MASTERinterface eth0virtual_router_id 51priority 101advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.1.201}}virtual_server 192.168.1.201 1234 { delay_loop 6lb_algo rrlb_kind DR# nat_mask 255.255.255.0#persistence_timeout 50protocol TCPreal_server 192.168.1.169 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}real_server 192.168.1.172 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}real_server 192.168.1.173 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}}备机上的keepalived配置[root@db163 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {router_id MySQL_LB2}vrrp_sync_group VSG {group {MySQL_Loadblancing}}vrrp_instance MySQL_Loadblancing {state BACKUPinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {192.168.1.201}}virtual_server 192.168.1.201 1234 {delay_loop 6lb_algo rrlb_kind DR# nat_mask 255.255.255.0#persistence_timeout 50protocol TCPreal_server 192.168.1.169 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}real_server 192.168.1.172 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}real_server 192.168.1.173 1234 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 1234}}}3.realserver(数据节点)上的配置分别在三个数据节点db169、db172、db173上安装如下脚本:[root@db172 ~]# cat /etc/init.d/lvsdr.sh#!/bin/bashVIP=192.168.1.201. /etc/rc.d/init.d/functionscase "$1" instart)/sbin/ifconfig lo down/sbin/ifconfig lo upecho "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce/sbin/sysctl -p >/dev/null 2>&1/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev lo:0echo "LVS-DR real server starts successfully.\n";;stop)/sbin/ifconfig lo:0 down/sbin/route del $VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "LVS-DR real server stopped.";;status)isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`isRoOn=`/bin/netstat -rn | grep "$VIP"`if [ "$isLoOn" == "" -a "$isRoOn" == "" ]; thenecho "LVS-DR real server has to run yet."elseecho "LVS-DR real server is running."fiexit 3;;*)echo "Usage: $0 {start|stop|status}"exit 1esacexit 0增加x权限:chmod +x /etc/init.d/lvsdr.sh增加开机自启动:echo "/etc/init.d/lvsdr.sh start" >> /etc/rc.local4.分别在三个数据节点db169、db172、db173上安装atlas下载atlas,并yum安装yum install -y Atlas-2.1.el6.x86_64.rpm配置atlas[root@db172 ~]# cat /usr/local/mysql-proxy/conf/f [mysql-proxy]#带#号的为非必需的配置项目#管理接口的用户名admin-username = admin#管理接口的密码admin-password = 123456#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔proxy-backend-addresses = 192.168.1.173:3306#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔proxy-read-only-backend-addresses = 192.168.1.169:3306@1,192.168.1.172:3306@1#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!pwds = usr_test:/iZxz+0GRoA=, usr_test2:/iZxz+0GRoA= ,root:/iZxz+0GRoA=#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为truedaemon = true#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为truekeepalive = true#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置event-threads = 10#日志级别,分为message、warning、critical、error、debug五个级别log-level = message#日志存放的路径log-path = /usr/local/mysql-proxy/log#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL 日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF#sql-log = OFF#实例名称,用于同一台机器上多个Atlas实例间的区分#instance = test#Atlas监听的工作接口IP和端口proxy-address = 0.0.0.0:1234#Atlas监听的管理接口IP和端口admin-address = 0.0.0.0:2345#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项#tables = person.mt.id.3#默认字符集,设置该项后客户端不再需要执行SET NAMES语句#charset = utf8#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接#client-ips = 127.0.0.1, 192.168.1#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置#lvs-ips = 192.168.1.15.启动数据节点(分别在三个数据节点上db169、db172、db173)5.1 启动mysql数据库5.2 启动atlas : /usr/local/mysql-proxy/bin/mysqld-proxyd test start5.3 启动lvs脚本:/etc/init/lvsdr.sh start6.启动keepalived(db162、db163上)/etc/init.d/keepalived start7.验证:启动keepalived后,主节点为db162,查看vip是不是启动了:[root@db162 ~]# ip ad1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWNlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:1d:7d:a8:40:d9 brd ff:ff:ff:ff:ff:ffinet 192.168.1.162/24 brd 192.168.1.255 scope global eth0inet 192.168.1.201/32 scope global eth0inet6 fe80::21d:7dff:fea8:40d9/64 scope linkvalid_lft forever preferred_lft forever验证此节点没有1234端口监听:[root@db162 ~]# netstat -anp|grep 1234此处无输出在192.168.1.55(db55)上连接192.168.1.201(注意此节点没有1234端口在监听,发来的连接会被路由到真正的数据节点)[root@db55 ~]# mysql -h 192.168.1.201 -P1234 -uroot -p123456Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1871354501Server version: 5.0.81-log Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || dd || mcldb || mysql || mysqlslap || performance_schema || test |+--------------------+7 rows in set (0.00 sec)数据是正确的8.监控lvs使用sysbench压力测试,然后监控线程分布:[root@topdb soft]# sysbench --test=oltp --num-threads=100 --max-requests=100000 --oltp-table-size=1000000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=dd --mysql-host=192.168.1.201 --mysql-port=1234 --mysql-user=root --mysql-password=123456 --oltp-nontrx-mode=select --oltp-read-only=on --db-ps-mode=disable runsysbench 0.4.12: multi-threaded system evaluation benchmarkRunning the test with following options:Number of threads: 100Doing OLTP test.Running non-transactional testDoing read-only testUsing Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases) Using "BEGIN" for starting transactionsUsing auto_inc on the id columnMaximum number of requests for OLTP test is limited to 100000Threads started!Done.OLTP test statistics:queries performed:read: 100033write: 0other: 0total: 100033transactions: 100033 (13416.81 per sec.)deadlocks: 0 (0.00 per sec.)read/write requests: 100033 (13416.81 per sec.)other operations: 0 (0.00 per sec.)Test execution summary:total time: 7.4558stotal number of events: 100033total time taken by event execution: 744.5136per-request statistics:min: 0.71msavg: 7.44msmax: 407.23msapprox. 95 percentile: 28.56msThreads fairness:events (avg/stddev): 1000.3300/831.91execution time (avg/stddev): 7.4451/0.00[root@db162 ~]# ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.201:1234 rr-> 192.168.1.169:1234 Route 3 0 33-> 192.168.1.172:1234 Route 3 0 34-> 192.168.1.173:1234 Route 3 0 34可以看出负载均衡在了三个节点。