Mysql实现主从、主主同步相关配置【Linux操作系统下-CentOS】

好像挺久没有写博客了,是什么原因呢?工作忙?好像并不是。没学什么新东西吗?也并不是,说白了就是懒吧。其实最近很多工作上需要用的技术,我都有去学(好像是废话,不学怎么完成工作呢?),但是过了一段时间就会忘记很多的细节,觉得应该是没有总结吧,不想只成为码农的我,赶紧开始总结强化一下自己学到的知识,废话就不多说了。

其实这篇博客呢,并没有涉及代码,只要具备了最基本的Linux操作系统的能力即可(相关命令),主要是为了解决高并发环境下,多个服务集群,减少关系型数据库的压力,进行数据库读写分离、数据备份等

一、准备工作

1.为了更好的模拟真实环境下的配置,分别在2台服务器上进行安装mysql数据库,并进行主从、主主同步配置的实现。当然,我等并不是土豪,只能在一台电脑下(win7系统)弄个VMware虚拟机,搞2个Linux(CentOS-32位)操作系统进行模拟操作了。

2.下载VMware(下面简称VM)、CentOS并安装(略)。CentOS的网络适配器选桥接模式(自动分配IP)

3.开机CentOS完成后,查看IP地址:

[root@ccw-CentOS etc]# ifconfig

  

其实默认使用的是eth0的网卡,但是我这边还有其他的设置,所以使用了eth1的网卡,但是并不影响我们。开机完后,发现用VM来操作CentOS不太方便,同时也为了更好模拟真实环境,我们用远程工具【secureCRT】来连接CentOS。

4.下载和安装secure(略)。安装完成后,连上咱自己的虚拟机:

5.CentOS中mysql数据库下载与安装(略),安装并启动完成后,查看mysql相关服务:

这样,我们搭建服务器的环境一完成了。然后说好是2台服务器,所以我们还要另外一台。

6.使用VM来克隆CentOS(略),作mysql主从同步,最好数据库环境达到一致。所以为了达到这种效果,直接把服务器克隆一份出来。克隆之后,分别是:localLinux01(ip:172.16.2.64)、localLinux02(ip:172.16.1.187)。

         

遇到的第一个坑:克隆CentOS之后,分别重启2台服务器,开机后,查看ip,ipconfig后发现,eth0不见了。刷新网卡报错:

Device eth0 does not seem to be present
网上百度,得到解决:https://www.linuxidc.com/Linux/2012-12/76248.htm

二、Mysql主从同步配置

1.相关说明:

数据主从同步,数据只能从主数据库实时同步到从数据库【主→从】,并不能实现从从数据库到主数据库,因此,一般主数据库作更新操作,从数据库作读操作,这样实现读写分离

主从同步的一些理解:主库创建一个账号,赋予对应的权限。该账号专门给从库来远程登录主库获取主库的日志文件(数据的更新记录),下载到从库的服务器,从库再执行相关操作,将数据写入到从库,从而达到主从同步。其中my.cnf文件是主从的一些参数配置。

环境说明:

localLinux01(ip:172.16.2.64)服务器中的mysql作为主数据库(master_a)

localLinux02(ip:172.16.1.187)服务器中的mysql作为从数据库(master_b)

2.修改mysql的my.cnf文件

my.cnf是mysql的参数配置文件,我们配置主从同步理论上只需要分别修改该配置文件即可。

①对localLinux01(ip:172.16.2.64),主数据库(master_a)进行配置:

⑴查找my.cnf文件:

[root@ccw-CentOS etc]# which mysqld
/usr/sbin/mysqld
[root@ccw-CentOS etc]# /usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'

发现有多个,mysql启动时,会优先读取最左边的那个my.cnf,如果左边目录没有my.cnf文件,可以新建一个。

⑵编辑my.cnf文件:

[root@ccw-CentOS etc]# vi etc/my.cnf

my.cnf的内容如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[client]
port = 3306

[mysqld]
server-id=1        #数据库唯一ID,主从的标识号绝对不能重复。

log-bin=mysql-bin    #开启bin-log,并指定文件目录和文件名前缀
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

replicate-ignore-db = mysql                                             #忽略不同步主从的数据库
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test

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]

配置好各种参数后,wq保存。

⑶重启mysql服务,使my.cnf文件的配置生效:

mysql> service mysql restart;

⑷进入mysql数据库:

mysql> mysql -uroot -p;

创建给从库使用的账号,并赋予相关权限:

mysql> grant replication slave on *.* to 'master_a'@'172.16.1.187' identified by '123456';
mysql> flush privileges;

*把所有库和表的replication 、slave 权限赋予master_a账号,并且该账号只能从172.16.1.187地址进行登录,并指定账号密码为123456

授权完成后,查看主库(master_a)的状态:

mysql> show master status;

记录 File和Position的值,从库配置时,需要使用。

②对localLinux02(ip:172.16.1.187),从数据库(master_b)进行配置:

⑴找到mysql的my.cnf文件,并进行编辑参数如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[client]
port = 3306

[mysqld]
server-id = 2

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

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]

配置好各种参数后,wq保存。

⑵重启mysql服务,使配置生效:

mysql> service mysql restart;

⑶进入mysql数据库:

mysql> mysql -uroot -p;

配置主从同步指令并查看

mysql> stop slave;   #执行同步前,要先关闭slave
mysql> change  master to master_host='172.16.2.64',master_user='master_a',master_password='123456',master_log_file='mysql-bin.000017',master_log_pos=231;
    
mysql> start slave;
mysql> show slave status \G;

查看slave的状态输入如下,看到2个Yes的话,表明已经成功。

自此,mysql主从同步已经完成。测试如下:

先去主库(master_a)里创建一个库(mytest)

再去从库(master_b)里,看是否已经同步过去

测试结果表名,已经成功!

三、Mysql主主同步配置

mysql主主同步其实是主从同步的一个扩展,主要把2个数据库都互为主从就可以了:

master_a数据库既是master_b的主库,又是master_b的从库

master_b数据库既是master_a的主库,又是master_a的从库

上面的主从同步,我们已经配置好master_a库是master_b库的主库。那我们再实现master_b是master_a的主库就可以实现主主同步了。

基于上面的主从同步,我们只需要再去localLinux02(ip:172.16.1.187)服务器里的mysql数据库(master_b)里,添加一个给localLinux01(ip:172.16.2.64)服务器的mysql数据库(master_a)使用的账号和权限,并在master_a里添加同步配置就可以了。

*不过基于主键自增的考虑,我们还需要分别给master_a和master_b的my.cnf文件添加2个参数。

⑴修改localLinux02(ip:172.16.1.187)的mysql数据库(master_b)

my.cnf添加如下配置

auto_increment_offset = 2
auto_increment_increment = 2                                            #偶数ID

master_b的my.cnf完整内容配置如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[client]
port = 3306

[mysqld]
server-id = 2
auto_increment_offset = 2
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

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]

重启mysql服务,使配置生效:

mysql> service mysql restart;

进入master_b库,创建给从库使用的账号,并赋予相关权限:

mysql> grant replication slave on *.* to 'master_b'@'172.16.2.64' identified by '123456';
mysql> flush privileges;

*把所有库和表的replication 、slave 权限赋予master_b账号,并且该账号只能从172.16.2.64地址进行登录,并指定账号密码为123456

授权完成后,查看主库(master_b)的状态:

mysql> show master status;

记录 File和Position的值,从库配置时,需要使用。

⑵修改localLinux01(ip:172.16.2.64)的mysql数据库(master_a)

my.cnf增加如下配置:

auto_increment_offset = 1
auto_increment_increment = 2                                            #奇数ID

master_a的my.cnf完整内容配置如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[client]
port = 3306

[mysqld]
server-id=1        #数据库唯一ID,主从的标识号绝对不能重复。
auto_increment_offset = 1
auto_increment_increment = 2                                            #奇数ID

log-bin=mysql-bin    #开启bin-log,并指定文件目录和文件名前缀
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

replicate-ignore-db = mysql                                             #忽略不同步主从的数据库
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test

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]

重启mysql服务,使配置生效:

mysql> service mysql restart;

进入mysql数据库:

mysql> mysql -uroot -p;

配置主从同步指令并查看

mysql> stop slave;   #执行同步前,要先关闭slave
mysql> change  master to master_host='172.16.1.187',master_user='master_b',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=2757;
    
mysql> start slave;
mysql> show slave status \G;

查看slave的状态输入如下,看到2个Yes的话,表明已经成功。

自此,mysql主主同步已经完成!

遇到的第二个坑,报错如下:

The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

mysql主从库的UUID不能相同,只需要把从库的auto.cnf文件删除,然后重启mysql,会自动生成新的UUID,就可以解决。

auto.cnf在mysql的安装目录。

删除auto.cnf:

[root@ccw-CentOS mysql]# rm -rf auto.cnf

重启mysql:

mysql> service mysql restart;

文章中,没有对my.cnf参数进行详细描述说明,大伙可以自行百度,按自己的需求进行配置,如有错漏,请指出。

参考:https://www.cnblogs.com/ygqygq2/p/6045279.html 

猜你喜欢

转载自blog.csdn.net/Ouyzc/article/details/82586908
今日推荐