Atlas+keepalived+mysql(实现HA+主从同步)

合集下载

使用KeepAlived实现服务进程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双活同步复制四种解决⽅案⽬录对于数据实时同步,其核⼼是需要基于⽇志来实现,是可以实现准实时的数据同步,基于⽇志实现不会要求数据库本⾝在设计和实现中带来任何额外的约束。

基于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主从复制的主备自动切换

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数据双向同步配置的方法配置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数据库如何设置主从同步

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数据库的主从同步(双主)教程,希望下文能帮助到各位哦.配置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从服务器上,使得从服务器上的数据与主服务器上的数据保持同步。

其原理主要基于MySQL的二进制日志复制机制。

实现主从同步的基本流程如下:
1.主服务器将所有的数据更改都记录到二进制日志中;
2.从服务器连接主服务器,并请求从主服务器获取日志文件及日志文件中指定位置之后的日志记录;
3.主服务器向从服务器发送请求的日志记录,从服务器将其添加到从服务器的中继日志(relay log)中;
4.从服务器读取中继日志中的数据更新到本地数据库中。

在这个过程中,主服务器上的二进制日志起到了记录每个数据更改的作用,而从服务器通过读取主服务器上的二进制日志实现数据同步。

其中,主从服务器之间的数据传输基于MySQL自带的网络协议完成。

通过采用主从同步的方式,可以将数据备份和复制的任务分离,提高数据的可靠性和可扩展性。

keepalived+mysql构建主从HA架构全过程,附配置文件

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。

如何使用MySQL实现数据交换和同步

如何使用MySQL实现数据交换和同步

如何使用MySQL实现数据交换和同步背景介绍:MySQL是一种关系型数据库管理系统,广泛应用于各行各业的数据管理和数据分析中。

在现实生活中,我们常常需要将数据从一个系统(或数据库)迁移到另一个系统(或数据库),或者实现不同数据库之间的数据同步。

本文将探讨如何使用MySQL实现数据交换和同步的方法和技巧。

一、数据导出与导入:将数据从一个MySQL数据库导出,并导入到另一个MySQL数据库是实现数据交换和同步的基础步骤。

MySQL提供了多种工具和方法来实现数据导出和导入。

1. 使用mysqldump命令:mysqldump是MySQL自带的一个命令行工具,用来导出MySQL数据库的数据。

通过以下命令可以将整个数据库导出为一个文件:mysqldump -u username -p password database_name > backup.sql其中,username为数据库用户名,password为密码,database_name为数据库名,backup.sql为导出的文件名。

通过该命令,可以将整个数据库的表结构和数据导出到backup.sql文件中。

2. 使用MySQL Workbench工具:MySQL Workbench是MySQL官方提供的一个图形化管理工具,它提供了导出和导入数据的功能。

通过打开MySQL Workbench,连接到目标数据库,选择要导出的数据库或者具体表,点击右键选择导出,可以将数据导出为SQL脚本或者CSV文件。

同样,将导出的文件导入到目标数据库即可实现数据交换和同步。

3. 使用INSERT INTO语句:如果只需要将某个表的数据导出为SQL脚本,可以使用INSERT INTO语句。

通过以下命令可以将表的数据导出为SQL脚本:SELECT * FROM table_name INTO OUTFILE 'output.sql'其中,table_name为要导出的表名,output.sql为导出的文件名。

mysql ha切换原理

mysql ha切换原理

MySQL的高可用性(High Availability,HA)切换原理可以通过以下步骤来解释:1. 主从复制(Master-Slave Replication):HA切换的基础是使用主从复制技术。

在一个MySQL服务器集群中,通常会有一个主服务器(Master)和多个从服务器(Slaves)。

主服务器负责处理写操作并将数据变更复制到从服务器上。

2. 心跳检测(Heartbeat):为了实现HA切换,主服务器和从服务器之间需要进行心跳检测。

心跳检测是通过定期发送心跳信号来确认服务器是否正常运行。

如果主服务器无法响应心跳信号,说明主服务器出现故障。

3. 故障检测与切换:当监测到主服务器故障时,系统会触发故障检测和切换机制。

故障检测会检查主服务器是否可用,如果不可用,则会将其中一个从服务器提升为新的主服务器。

这个过程称为故障切换。

4. 选举机制(Election):在故障切换过程中,系统需要选择一个新的主服务器。

一般情况下,MySQL使用基于权重的选举机制来选择新的主服务器。

选举机制会评估从服务器的性能、延迟和配置等因素,并根据配置的权重来选择新的主服务器。

5. 数据同步:在故障切换完成后,新的主服务器需要将之前主服务器上未同步的数据同步到从服务器上。

这个过程称为数据同步。

6. 客户端重定向:一旦故障切换完成并且数据同步完毕,系统需要通知客户端使用新的主服务器进行操作。

这可以通过DNS解析、负载均衡器或应用层代码等方式来实现。

总结起来,MySQL的HA切换原理涉及主从复制、心跳检测、故障检测与切换、选举机制、数据同步和客户端重定向等步骤。

这些步骤共同协作,保证在主服务器故障时能够快速切换到一个可用的从服务器,确保系统的高可用性和数据的一致性。

Keepalive实现Mysql主主复制,高可用群集

Keepalive实现Mysql主主复制,高可用群集

Keepalive实现Mysql主主复制,高可用群集一、安装前准备关闭iptables:service iptables stop;chkconfig iptables off关闭SELinuxvi /etc/selinux/config查询系统是否有安装mysql,如有则移除。

rpm -qa | grep mysql移除已安装的mysql:yum remove mysql-libs-5.1.66-2.el6_3.x86_64二、安装数据库安装需要的插件:yum install perl perl-devel libaiolibaio-devel安装MySQL-shared-compat 替换mysql-libs,如果不替换,在删除mysql-libs,会提示postfix 依赖于mysql-libsrpm -ivh MySQL-shared-compat-5.6.26-1.el6.x86_64.rpm安装服务端:rpm -ivh MySQL-server-5.6.26-1.el6.x86_64.rpm安装客户端:rpm -ivh MySQL-client-5.6.26-1.el6.x86_64.rpm设置开机自动启动:chkconfig mysql on启动mysql:service mysql start停止mysql:service mysql stop获取root的密码:more /root/.mysql_secret修改root密码并删除匿名账户:/usr/bin/mysql_secure_installation--user=mysql修改主机名:vi /etc/sysconfig/networkvi /etc/hosts修改主服务器配置文件(配置文件见附件):vi /usr/f修改从服务器配置文件(配置文件见附件):进入mysql:mysql -u root -pshow master statusshow global variables like …%uuid%‟在两台机器上都创建复制账户并授权:grant replication slave on *.* to …mysql‟@‟192.168.2.%‟identified by …mysql‟;flush privileges; #重加载权限从库连接主库:change master to master_host=…192.168.2.61‟,master_user=…mysql‟,master_password=…mysql‟, master_port=3306,master_auto_position=1;start slave;主库连接从库:change master to master_host=…192.168.2.62‟,master_user=…mysql‟,master_password=…mysql‟, master_port=3306,master_auto_position=1;start slave;三、安装并配置keepalived(配置文件见附件)yum install keepalivedvi /etc/keepalived/keepalived.conf四、测试:grant all privileges on *.* to …root‟@‟%‟identified by …123456‟;mysql -h “192.168.2.60” -u root –pshow variables like “server_id”;show processlist;show databases;show slave status\G;show master status\G;有兴趣朋友可以了解更多java教程/java/video.shtml。

KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群

KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群

KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群1.这个环境最大的缺陷在于主机写入速度极慢,主键重复。

2.mysql最好采用5.6以上集群版本,5.5以下单线程版本不大适合。

博客中的mysql为5.5,实际测试挺差的,换成5.6之后十分完美,请各位运维在意一下。

环境:CentOS6.4 apache2.4.4 PHP5.3.27 MYSQL5.5.33机器vip 192.168.1.100MASTER:192.168.1.101BACKUP:192.168.1.102高可用部分:yum install ipvsadmyum install keepalivediptables –F如果不允许禁用iptables请在/etc/sysconfig/iptables里面加上-A INPUT -d 224.0.0.18/16 -j ACCEPT (vrrp的组播)-A INPUT -p vrrp -j ACCEPT-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEP service iptables restartsetenforce 0MASTER:vi /etc/keepalived/keepalived.confglobal_defs {notification_email {barbytang@/doc/cc12041334.html, #邮件地址}router_id LVS1}vrrp_sync_group GLVS {group {mysqlha #组名}vrrp_instance mysqlha {state MASTER (经过测试这里写MASTER或者BUCKUP对整个系统都没有影响)interface eth0 (注意看当前工作网卡,我就有过遇到bond0的状况)lvs_sync_daemon_inteface eth0virtual_router_id 51priority 180advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100}}virtual_server 192.168.1.100 3306 { #mysql端口delay_loop 6 lb_algo rr #LVSlb_kind DR #LVS采用DR模式persistence_timeout 20protocol TCPsorry_server 192.168.1.102 3306real_server 192.168.1.101 3306 { #buckup机器也这么写,原因是因为让正常工作时只用101weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 3306}}BACKUP:vim /etc/keepalived/keepalived.conf global_defs {notification_email {barbytang@/doc/cc12041334.html, } router_id LVS1}vrrp_sync_group test {group {mysqlha}}vrrp_instance mysqlha {state BACKUPinterface eth0lvs_sync_daemon_inteface eth0virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100}}virtual_server 192.168.1.100 3306 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 20protocol TCPsorry_server 192.168.1.102 3306real_server 192.168.1.101 3306 {weight 3TCP_CHECK {connect_timeout 3nb_get_retry 3delay_before_retry 3connect_port 3306}}}注意:两个配置文件中,只有stat 和priority不一样其他都一样在MASTER和BUCKUP中都要添加realserver脚本:(注意给function 执行权限)realserver脚本:vi /etc/rc.d/init.d/realserver.sh#!/bin/bash# description: Config realserver lo and apply noarpSNS_VIP=192.168.1.100/etc/rc.d/init.d/functionscase "$1" instart)ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP/sbin/route add -host $SNS_VIP dev lo:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1echo "RealServer Start OK";;stop)ifconfig lo:0 downroute del $SNS_VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped";;*)echo "Usage: $0 {start|stop}"exit 1esacexit 0——————分割线————————————mysql主主同步:主机A /etc//doc/cc12041334.html,fserver-id = 1log-bin=mysql-binbinlog-do-db=utooo #同步的库,公司的库是utooo,有的服务器用的是chinamobile 注意修改binlog-ignore-db=mysql #忽略的库replicate-ignore-db=mysql,information_schema,test #同上,自己选择#auto-increment-increment = 2#auto-increment-offset = 1log-slave-updatesslave-skip-errors=allsync_binlog=1注释行的作用是是否启用主键奇偶递增主机B /etc//doc/cc12041334.html,fserver-id = 2log-bin=mysql-binbinlog-do-db=utooo #同步的库,公司的库是utooo,有的服务器用的是chinamobile 注意修改binlog-ignore-db=mysqlreplicate-ignore-db=mysql,information_schema,test#auto-increment-increment = 2#auto-increment-offset = 2log-slave-updatesslave-skip-errors=allsync_binlog=1在机器A和B上分别操作:>#service mysql restart>#mysql -uroot -pmysql> GRANT REPLICATION SLAVE ON *.* TO'forapp1'@'192.168.1.101' INDENTIFIED BY '123456'; #A和B分别添加注意主机名mysql>flush privileges;mysql>show master status\G; #AB机器分别输入*************************** 1. row *************************** File: mysql-bin.000005Position: 120Binlog_Do_DB:Binlog_Ignore_DB: mysqlExecuted_Gtid_Set:1 row in set (0.00 sec)mysql> flush tables with read lock;mysql> show master status\G;*************************** 1. row *************************** File: mysql-bin.000005Position: 120Binlog_Do_DB:Binlog_Ignore_DB: mysqlExecuted_Gtid_Set:1 row in set (0.00 sec)#以上是两台机器输出的结果若报错#mysql> show master status;#Empty set (0.00 sec)mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)mysql> stop slave;Query OK, 0 rows affected (0.00 sec)#两台机器分别输入,注意都必须填写另一台机器上输出的内容mysql> change master tomaster_host='192.168.1.101',master_user='forapp2',master_password='1234 56',master_log_file='mysql-bin.000007',master_log_pos=120;mysql> flush privileges;mysql> start slave;mysql> show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.1.101Master_User: forapp2Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000007Read_Master_Log_Pos: 204Relay_Log_File: vipc-test2-relay-bin.000002Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000007Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB: mysql,information_schemaReplicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 204Relay_Log_Space: 545Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: eff28147-0906-11e3-bdb8-000c29477513 Master_Info_File:/var/lib/mysql//doc/cc12041334.html, SQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update itMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 01 row in set (0.00 sec)测试:1.ipvsadm -ln 可以测试当前运行的是哪台机器的mysql2.如果正在运行的是A,停掉A的mysql之后看看有没有自动切换到B3.切换到B之后,启动A,看看是否会切回来4.停掉A,在B中添加数据,启动A,检查数据是否同步(事实证明一定能同步)5执行.tcpdump vrrp,从vip走的tcp数据应该是指向228.0.0.18vrrp的组播五、处理vip无法被应用绑定内核参数:net.ipv4.ip_nonlocal_bind=1。

MySQL双机热备(keepalived+mysql双主)

MySQL双机热备(keepalived+mysql双主)

科普描述双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。

当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。

MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。

使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。

1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。

在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。

2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。

一组VRRP路由器协同工作,共同构成一台虚拟路由器。

Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。

当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。

环境服务器:•DB102:172.20.20.102 、centos6.5、mysql5.7、hostname:DB102•DB105:172.20.20.105 、centos6.5、mysql5.7、hostname:DB105•vip:172.20.20.110 (虚拟)•101:172.20.20.101 (用来远程调用vip 测试)组件包:•keepalived-1.1.20.tar.gz(/download.html)•ipvsadm-1.26-1.src.rpm(/software/ipvs.html)•popt-static-1.13-7.el6.x86_64.rpm(https:///download/popt-static)•libnl-1.1.4.tar.gz(/~tgr/libnl/)主从复制原理架构图•第一步就是master记录二进制日志。

Mysql主从同步在线实施步骤【适合大数据库从库配置】

Mysql主从同步在线实施步骤【适合大数据库从库配置】

Mysql主从同步在线实施步骤【适合⼤数据库从库配置】Mysql主从同步在线实施步骤【适合⼤数据库从库配置】 MySQL的主从搭建⼤家有很多种⽅式,传统的mysqldump⽅式是很多⼈的选择之⼀,但⽐较适合在新实例中实施,对于较⼤的数据库则存在停机等不可接受的问题,所以该⽅式并⾮理想的选择。

使⽤innobackupex 则可以快速轻松的构建或修复mysql主从架构,该⽅式的好处是对主库⽆需备份期间导致的相关性能压⼒及锁表的问题。

主:10.8.8.53从:10.8.8.72步骤:1. 分别在主从机上安装依赖环境及同步⼯具percona-xtrabackuprpm -i --force --nodeps libmysqlclient18-10.1.22-alt1.x86_64.rpmyum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQLyum install percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm 2.主备份数据(模拟主在线每1秒写⼊⼀条数据)cd /home/ xtrabackup-mysql本地压缩备份:(主执⾏)innobackupex --defaults-file=/opt/mysql/conf/f --host=192.168.8.53 --user=root --password=*** --socket=/opt/mysql/pid/mysqld3310.sock --stream=tar ./log001/ 2>log001.log | gzip1>log001.tar.gz2019-01-30:/usr/local/xtrabackup/bin/innobackupex --defaults-file=/data/mysql/mysql_master/f --host=127.0.0.1 --user=root --password=xxxx --port=xxx6 --socket=/data/mysql/mysql_master/data/mysql.sock --stream=tar ./backup/ 3.传送到从机器上scp log001.tar.gz root@192.168.8.72:/home/xtrabackup-mysql 4.在从机器上解压压缩包cd /home/xtrabackup-mysqltar zxvf log001.tar.gz –C data  5.在从机上把备份的⽬录prepare好innobackupex --apply-log --use-memory=4GB ./data #--use-memory:配置内存,加快速度 6.把prepare好的备份⽬录拷贝回数据⽬录(注意:可先备份原来数据库⽬录,拷贝后会⽣成数据库⽬录)【事实证明这⼀步不⽤也可以】mv /home/mysqldata/mysql3300/data /home/mysqldata/mysql3300/data.bakinnobackupex --copy-back ./data 7.修改权限:chown -R mysql:mysql /home/mysqldata 8.重启从数据库systemctl restart mysqld.service 9.进⼊从数据库,配置从的主库CHANGE MASTER TOMASTER_HOST='192.168.8.53',MASTER_USER='root',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='mysql-bin.000109 ',MASTER_LOG_POS=863747237;CHANGE MASTER TO MASTER_HOST='192.168.8.53',MASTER_USER='root',MASTER_PASSWORD='xxxx',MASTER_PORT=xxxx,MASTER_LOG_FILE='mysql-bin.000109',MASTER_LOG_POS=863747237;  10.开启从库start slave; 11.查看从状态show slave status\G; 12.对⽐主从数据是否⼀致(下⾯是测试截图)主:从:。

Mysql主从同步的实现原理

Mysql主从同步的实现原理

Mysql 主从同步的实现原理
MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,
目前属于Oracle 旗下产品。

MySQL 是最流行的关系型数据库管理系统之一,在WEB 应用方面,MySQL 是最好的RDBMS (RelaTIonal Database Management System,关系数据库管理系统)应用软件。

MySQL 是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活
性。

MySQL 所使用的SQL 语言是用于访问数据库的最常用标准化语言。

MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速
度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发
都选择MySQL 作为网站数据库。

由于其社区版的性能卓越,搭配PHP 和Apache 可组成良好的开发环境。

MySQL数据库主从同步实战过程详解

MySQL数据库主从同步实战过程详解

MySQL数据库主从同步实战过程详解⽬录安装环境说明安装MySQL数据库服务配置主库配置从库实现主从同步测试主从同步本⽂实例讲述了MySQL数据库主从同步实战过程。

分享给⼤家供⼤家参考,具体如下:接上⼀篇:安装环境说明系统环境:[root@~]# cat /etc/redhat-releaseCentOS release 6.5 (Final)[root@~]# uname -r2.6.32-431.el6.x86_64数据库:由于是模拟环境,主从库在同⼀台服务器上,服务器IP地址192.168.1.7主库使⽤3306端⼝从库使⽤3307端⼝数据库数据⽬录/data安装MySQL数据库服务下载软件包今天我们是⽤⼆进制安装包进⾏布署MySQL数据库服务,其它⽅式的安装布署⽅法请参考前⾯的⽂章[root@~]#wget /mysql/MySQL-5.5/mysql-5.5.51-linux2.6-x86_64.tar.gz创建数据⽬录、软件安装⽬录[root@~]#mkdir /data{3306,3307} -p[root@~]#mkdri /application解压软件[root@~]#tar zxf mysql-5.5.51-linux2.6-x86_64.tar.gz[root@~]#mv mysql-5.5.51-linux2.6-x86_64 /application/mysql-5.5.51[root@~]#ln -s /application/mysql-5.5.51 /application/mysql创建⽤户[root@~]#groupadd mysql[root@~]#useradd -g mysql -M mysql初始化数据库[root@~]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql [root@~]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql 创建配置⽂件[root@~]#vi /data/3306/f[client]port = 3306socket = /data/3306/mysql.sock[mysql]no-auto-rehash[mysqld]user = mysqlport = 3306socket = /data/3306/mysql.sockbasedir = /application/mysqldatadir = /data/3306/dataopen_files_limit = 1024back_log = 600max_connections = 800max_connect_errors = 3000table_cache = 614external-locking = FALSEmax_allowed_packet =8Msort_buffer_size = 1Mjoin_buffer_size = 1Mthread_cache_size = 100thread_concurrency = 2query_cache_size = 2Mquery_cache_limit = 1Mquery_cache_min_res_unit = 2kthread_stack = 192Ktmp_table_size = 2Mmax_heap_table_size = 2Mlong_query_time = 1pid-file = /data/3306/mysql.pidlog-bin = /data/3306/mysql-bin#主从同步的关键点,从库上不需要开启relay-log = /data/3306/relay-binrelay-log-info-file = /data/3306/binlog_cache_size = 1Mmax_binlog_cache_size = 1Mmax_binlog_size = 2Mexpire_logs_days = 7key_buffer_size = 16Mread_buffer_size = 1Mread_rnd_buffer_size = 1Mbulk_insert_buffer_size = 1Mlower_case_table_names = 1skip-name-resolveslave-skip-errors = 1032,1062replicate-ignore-db=mysqlserver-id = 1 #主库从库ID 不可相同[mysqldump]quickmax_allowed_packet = 2M[mysqld_safe]log-error=/data/3306/mysql3306.errpid-file=/data/3306/mysqld.pid数据库启动脚本:[root@~]#vi /data/3306/mysql#!/bin/shport=3306user="root"pwd="123456"Path="/application/mysql/bin"sock="/data/${port}/mysql.sock"start_mysql(){if [ ! -e "$sock" ];thenprintf "Starting MySQL...\n"/bin/sh ${Path}/mysqld_safe --defaults-file=/data/${port}/f 2>&1 > /dev/null & elseprintf "MySQL is running...\n"exitfi}stop_mysql(){if [ ! -e "$sock" ];thenprintf "MySQL is stopped...\n"exitelseprintf "Stoping MySQL...\n"${Path}/mysqladmin -u ${user} -p${pwd} -S /data/${port}/mysql.sock shutdownfi}restart_mysql(){printf "Restarting MySQL...\n"stop_mysqlsleep 2start_mysql}case $1 instart)start_mysql;;stop)stop_mysql;;restart)restart_mysql;;*)printf "Usage: /data/${port}/mysql {start|stop|restart}\n"esac备注:主从库配置⽂件与启动⽂件⼀样,只需修改端⼝与server-id即可完成配置授权⽬录并增加启动⽂件可执⾏权限[root@~]#chown -R mysql.mysql /data[root@~]#find /data -name mysql -exex chmod +x {} \;启动数据库[root@~]#/data/3306/mysql start[root@~]#/data/3307/mysql start修改默认数据库密码[root@~]#mysqladmin -uroot password '123456' -S /data/3306/mysql.sock[root@~]#mysqladmin -uroot password '123456' -S /data/3307/mysql.sock测试登陆,可以登陆两个数据库即可完成全部安装过程配置主库1)备份主库mkdir /backup登陆主库创建⽤步同户并授权[root@~]#mysql -uroot -p123456 -S /data/3306/mysql.sockmysql> grant replication slave on *.* to rep@'192.168.1.%' identified by'123456';Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)执⾏锁表操作[root@~]#/application/mysql/bin/mysql -uroot -p123456 -S /data/3306/mysql.sock -e "flush table with read lock;"备份主库[root@~]#/application/mysql/bin/mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show master status;" >/backup/mysql.log[root@~]#/application/mysql/bin/mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B |gzip >/backup/mysql.sql.gz解除锁表状态[root@~]#/application/mysql/bin/mysql -uroot -p123456 -S /data/3306/mysql.sock -e "unlock tables;"备注:以上操作也可以登陆主库进⾏,但是需要注意的是,执⾏锁表操作后,需要另开启⼀个窗⼝进⾏数据备份,不可直接退出,防⽌有数据写⼊导致备份的数据不完整。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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可以看出负载均衡在了三个节点。

相关文档
最新文档