mysql双主可以同时写数据_Mysql双主操作
在企业中,数据库⾼可⽤⼀直是企业的重中之重,中⼩企业很多都是使⽤mysql主从⽅案,⼀主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql⼊⼝,增加⾼可⽤。不过多主需要考虑⾃增长ID问题,这个需要特别设置配置⽂件,⽐如双主,可以使⽤奇偶,总之,主之间设置⾃增长ID相互不冲突就能完美解决⾃增长ID冲突问题。
主从同步复制原理
在开始之前,我们先来了解主从同步复制原理。
复制分成三步:
1. master将改变记录到⼆进制⽇志(binary log)中(这些记录叫做⼆进制⽇志事件,binary log events);
2. slave将master的binary log events拷贝到它的中继⽇志(relay log);
3. slave重做中继⽇志中的事件,将改变反映它⾃⼰的数据。
下图描述了这⼀过程:
该过程的第⼀部分就是master记录⼆进制⽇志。在每个事务更新数据完成之前,master在⼆⽇志记录这些改变。MySQL将事务串⾏的写⼊⼆进制⽇志,即使事务中的语句都是交叉执⾏的。在事件写⼊⼆进制⽇志完成后,master通知存储引擎提交事务。
下⼀步就是slave将master的binary log拷贝到它⾃⼰的中继⽇志。⾸先,slave开始⼀个⼯作线程——I/O线程。I/O线程在master上打开⼀个普通的连接,然后开始binlog dump process。Binlog dump process从master的⼆进制⽇志中读取事件,如果已经跟上master,它会睡眠并等待master产⽣新的事件。I/O线程将这些事件写⼊中继⽇志。
SQL slave thread处理该过程的最后⼀步。SQL线程从中继⽇志读取事件,更新slave的数据,使其与
master中的数据⼀致。只要该线程与I/O线程保持⼀致,中继⽇志通常会位于OS的缓存中,所以中继⽇志的开销很⼩。
此外,在master中也有⼀个⼯作线程:和其它MySQL的连接⼀样,slave在master中打开⼀个连接也会使得master开始⼀个线程。
MySQL5.6以前的版本复制过程有⼀个很重要的限制——复制在slave上是串⾏化的,也就是说master上的并⾏更新操作不能在slave上并⾏操作。 MySQL5.6版本参数slave-parallel-workers=1 表⽰启⽤多线程功能。
MySQL5.6开始,增加了⼀个新特性,是加⼊了全局事务 ID (GTID) 来强化数据库的主备⼀致性,故障恢复,以及容错能⼒。
MySQL双主(主主)架构⽅案思路是:
1.两台mysql都可读写,互为主备,默认只使⽤⼀台(masterA)负责数据的写⼊,另⼀台(masterB)备⽤;
2.masterA是masterB的主库,masterB⼜是masterA的主库,它们互为主从;
3.两台主库之间做⾼可⽤,可以采⽤keepalived等⽅案(使⽤VIP对外提供服务);
4.所有提供服务的从服务器与masterB进⾏主从同步(双主多从);
5.建议采⽤⾼可⽤策略的时候,masterA或masterB均不因宕机恢复后⽽抢占VIP(⾮抢占模式);
这样做可以在⼀定程度上保证主库的⾼可⽤,在⼀台主库down掉之后,可以在极短的时间内切换到另⼀台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压⼒;
但是也有⼏个不⾜的地⽅:
1.masterB可能会⼀直处于空闲状态(可以⽤它当从库,负责部分查询);
2.主库后⾯提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成⼀定程度的同步延时;
架构的简易图如下:
主主环境(这⾥只介绍2台主的配置⽅案):
1.CentOS 6.8 64位 2台:masterA(19
2.168.10.11),masterB(192.168.10.12)
2.官⽅Mysql5.6版本
搭建过程:
1.安装MySQL服务(建议源码安装)
1.1 yum安装依赖包
yum -y install make gcc gcc-c++ ncurses-devel bison openssl-devel
1.2 添加MySQL所需要的⽤户和组
groupadd -g 27 mysql
adduser -u 27 -g mysql -s /sbin/nologin mysql
1.3 下载MySQL源码包
mkdir -p /data/packages/src
cd /data/packages/
1.4 创建mysql数据⽬录
mkdir -p /usr/local/mysql/data
mysql配置与安装过程
1.5 解压编译安装cmake、MySQL
cd /data/packages/src
tar -zxvf ../cmake-3.2.
cd cmake-3.2.3/
./bootstrap
gmake
make install
cd ../
tar xf mysql-5.6.
cd mysql-5.6.34
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc \
-DWITH_SSL=bundled -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/usr/local/mysql/data
make && make install
1.6 添加开机启动脚本
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
1.7 添加masterA配置⽂件/etc/myf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
basedir = /usr/local/mysql
port = 3306
socket = /tmp/mysql.sock
datadir = /usr/local/mysql/data
pid-file = /usr/local/mysql/data/mysql.pid
log-error = /usr/local/mysql/
server-id = 1
auto_increment_offset = 1
auto_increment_increment = 2 #奇数ID
log-bin = mysql-bin #打开⼆进制功能,MASTER主服务器必须打开此项
binlog-format=ROW
binlog-row-p_w_picpath=minimal
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=0
sync_binlog=0
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
#expire_logs_days=5
max_binlog_size=1024M #binlog单⽂件最⼤值
replicate-ignore-db = mysql #忽略不同步主从的数据库
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = zabbix
max_connections = 3000
max_connect_errors = 30
skip-character-set-client-handshake #忽略应⽤程序想要设置的其他字符集init-connect='SET NAMES utf8' #连接时执⾏的SQL
character-set-server=utf8 #服务端默认字符集
wait_timeout=1800 #请求的最⼤连接时间
interactive_timeout=1800 #和上⼀参数同时修改才会⽣效
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式max_allowed_packet = 10M
bulk_insert_buffer_size = 8M
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 4M
key_buffer_size = 256M
read_buffer_size = 16K
skip-name-resolve
slow_query_log=1
long_query_time = 6
slow_query_log_file=slow-query.log
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysqldump]
quick
max_allowed_packet = 16M
[mysqld_safe]
1.8 特别参数说明
log-slave-updates = true #将复制事件写⼊binlog,⼀台服务器既做主库⼜做从库此选项必须要开启#masterA⾃增长ID
auto_increment_offset = 1
auto_increment_increment = 2 #奇数ID
#masterB⾃增加ID
auto_increment_offset = 2
auto_increment_increment = 2 #偶数ID
1.9 添加masterB配置⽂件/etc/myf
[client]
port = 3306
socket = /tmp/mysql.sock