mysql 主从部署
1.准备3台服务器 (如果是镜像的同一个mysql 需要注意,同步的时候要修改uuid)
192.168.0.74 主服务器
192.168.0.75 从服务器
192.168.0.18 maxscale 服务器
2.配置主服务器 192.168.0.74
1.vim /etc/my.cnf
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid #指定服务器id server_id=74 #启用binlog日志,并指定文件名后缀 log-bin=master74 ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schem ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=16M ### 主从复制的格式(mixed,statement,row,默认格式是statement) binlog_format=mixed ### 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 expire_logs_days=30 ### 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ### 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ### 控制binlog的写入频率。每执行多少次事务写入一次 ### 这个参数性能消耗很大,但可减小MySQL崩溃造成的损失,为0表示不控制 sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 ~
2.重启生效 systemctl restart mysqld
2.主服务器添加授权用户,并查看bInlog日志信息
登录主服务器
mysql -u root -p 123456
mysql> grant all on *.*to repluser@'%' identified by '111111';
mysql> show master status;
3.从服务器配置
vim /etc/my.cnf
[mysqld] # # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid server_id=75 ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schem ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=16M ### 主从复制的格式(mixed,statement,row,默认格式是statement) binlog_format=mixed ### 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 expire_logs_days=30 ### 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ### 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ### relay_log配置中继日志 relay_log=mysql-relay-bin ### log_slave_updates表示slave将复制事件写进自己的二进制日志 ### 主要为了作为其他的master log_slave_updates=ON ### 防止改变数据(除了特殊的线程) read_only=1 #(为了使备机随时转正,所以这里允许写) ### MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障, 然后才会重连并且追赶这段时间主库的数据,默认60 slave-net-timeout = 20 ### 如果启用,此变量将在服务器启动后立即启用自动中继日志恢复。 relay_log_recovery = ON ### 该变量确定从站在中继日志中的位置是写入FILE还是写入表 relay_log_info_repository = TABLE
保存 生效 systemctl restart mysqld
3.登录 从服务器 配置好ip ,账号,密码 注意, master_log_file 的路径,master重启一次,这个值就会变化一次,要重新运行
change master to master_host='192.168.1.50',master_user='repluser',master_password='123456',master_log_file='master50.000001',master_log_pos=154;
show slave status\G; 查看同步状况
start slave; 开启同步
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master74.000002 Read_Master_Log_Pos: 629 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 794 Relay_Master_Log_File: master74.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 629 Relay_Log_Space: 1001 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 74 Master_UUID: d1dcb1cd-5e38-11ec-9d29-fa202017ac1f Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表示成功
如果有false 则表示同步失败
报错: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
表示从库和主库的uuid 相同
解决: 找到auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可
[root@localhost ~]# find / -name auto.cnf /var/lib/mysql/auto.cnf [root@localhost ~]# cat /var/lib/mysql/auto.cnf //查看主数据库auto.cnf文件中的UUID信息 [auto] server-uuid=e46c9961-5780-11ea-bf2f-000c291a8b6b [root@localhost ~]# mysql -uroot -p123qqq...A ... mysql> show variables like '%server_uuid%'; //查看主数据库UUID +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | e46c9961-5780-11ea-bf2f-000c291a8b6b | +---------------+--------------------------------------+
更改从库数据
[root@dbsrv2 ~]# mv /data/mysqldata/auto.cnf /data/mysqldata/auto.cnf.bk ###重命名该文件
[root@dbsrv2 ~]# systemctl restart mysqld ###重启mysql
添加数据在主库上添加后,可以在从库上看到数据 从库上添加数据后,主库看不到
三、配置MaxScale代理服务器
maxscale下载地址:https://downloads.mariadb.com/MaxScale/
[root@instance-0k9n9mw6 solf]# rpm -ivh maxscale-2.4.5-1.centos.7.x86_64.rpm
warning: maxscale-2.4.5-1.centos.7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 28c12247: NOKEY
error: Failed dependencies:
libgnutls.so.28()(64bit) is needed by maxscale-2.4.5-1.x86_64
libgnutls.so.28(GNUTLS_1_4)(64bit) is needed by maxscale-2.4.5-1.x86_64
libgnutls.so.28(GNUTLS_3_0_0)(64bit) is needed by maxscale-2.4.5-1.x86_64
libgnutls.so.28(GNUTLS_3_1_0)(64bit) is needed by maxscale-2.4.5-1.x86_64
[root@instance-0k9n9mw6 solf]# rpm -ivh maxscale-2.4.5-1.centos.7.x86_64.rpm --force --nodeps
warning: maxscale-2.4.5-1.centos.7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 28c12247: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:maxscale-2.4.5-1 ################################# [100%]
修改 配置文件
vim /etc/maxscale.cnf
内容
2.4中移除MySQL驱动,全部统一使用MariaDB驱动,即配置文件中,选择驱动的时候,不需要修改**[MariaDB Monitor]为[MySQL Monitor]**
# MaxScale documentation: # https://mariadb.com/kb/en/mariadb-maxscale-24/ # Global parameters # # Complete list of configuration options: # https://mariadb.com/kb/en/mariadb-maxscale-24-mariadb-maxscale-configuration-guide/ [maxscale]
# 开启线程个数,默认为1.设置为auto会同cpu核数相同
threads=auto
# timestamp精度
#ms_timestamp=1
# 将日志写入到syslog中
#syslog=1
# 将日志写入到maxscale的日志文件中
#maxlog=1
# 不将日志写入到共享缓存中,开启debug模式时可打开加快速度
#log_to_shm=0
# 记录告警信息
#log_warning=1
# 记录notice
#log_notice=1
# 记录info
#log_info=1
# 不打开debug模式
#log_debug=0
# 日志递增
#log_augmentation=1
# 相关目录设置
#basedir=/usr/local/maxscale/
#logdir=/u01/maxscale/logs/trace/
#datadir=/u01/maxscale/data/
#cachedir=/u01/maxscale/cache/
#piddir=/u01/maxscale/tmp/
# Server definitions # # Set the address of the server to the network # address of a MariaDB server. # [server1] type=server address=192.168.0.74 port=3306 protocol=MariaDBBackend #serv_weight=3 #读的比重 [server2] type=server address=192.168.0.75 port=3306 protocol=MariaDBBackend #serv_weight=3 #读的比重 # Monitor for the servers # # This will keep MaxScale aware of the state of the servers. # MariaDB Monitor documentation: # https://mariadb.com/kb/en/mariadb-maxscale-24-mariadb-monitor/ [MariaDB-Monitor] type=monitor module=mariadbmon servers=server1,server2 user=maxscale_monitor password=12345
# 心跳间隔20s
monitor_interval=2000# 如果有5.1的mysql版本,一定要设置此项,否者slave频繁报lost_slave
#mysql51_replication=
true
# 当slave断掉时,是否将所有访问指向master
#detect_stale_master =
true
# Service definitions # # Service Definition for a read-only service and # a read/write splitting service. # # ReadConnRoute documentation: # https://mariadb.com/kb/en/mariadb-maxscale-24-readconnroute/ #[Read-Only-Service] #type=service #router=readconnroute #servers=server1 #user=myuser #password=mypwd #router_options=slave # ReadWriteSplit documentation: # https://mariadb.com/kb/en/mariadb-maxscale-24-readwritesplit/ [Read-Write-Service] type=service router=readwritesplit servers=server1,server2 user=maxscale_route password=12345#所有的slave提供
select
查询服务
max_slave_connections=100%#master_accept_reads=
true
#master是否接受读请求
#auth_all_servers=true #
#log_auth_warnings=true #身份验证失败和警告的日志记录,记录那些试图连接到MaxScale和来自哪里
#filters=Hint #强制select走master的选项
#允许slave落后master多少秒
max_slave_replication_lag=3600
# Listener definitions for the services
#
# These listeners represent the ports the
# services will listen on.
#
#[Read-Only-Listener]
#type=listener
#service=Read-Only-Service
#protocol=MariaDBClient
#port=4008
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
保存cnf
然后在主从服务器上配置 cnf中的账户
1.监视账户 这个地方感觉应该用到% 如果用到固定ip的话,客户端连接会失败
grant all privileges on *.* to 'maxscale_monitor'@'%' identified by '123456';
2.路由账户
grant all privileges on *.* to 'maxscale_route'@'%' identified by '123456';
然后运行 maxscale.cnf 如果报错 libgnutls.so.28, 安装 yum install gnutls
[root@instance-0k9n9mw6 solf]# maxscale -f /etc/maxscale.cnf maxscale: error while loading shared libraries: libgnutls.so.28: cannot open shared object file: No such file or directory [root@instance-0k9n9mw6 solf]# yum install gnutls
重新运行 maxscale.cnf 加用户运行
maxscale -f /etc/maxscale.cnf -U maxscale
查看是否运行成功
netstat -ntlup |grep maxscale
网上说的有配置
maxadmin -uadmin -pmariadb -P4016 这种的是低版本的,高版本的已经去掉这个了
直接运行 查看服务
maxctrl list services
maxctrl list servers
[root@instance-0k9n9mw6 solf]# maxscale -f /etc/maxscale.cnf Error: MaxScale cannot be run as root. Failed to write child process message! [root@instance-0k9n9mw6 solf]# maxscale -f /etc/maxscale.cnf -U maxscale
找到一台安装mysql的服务器 然后链接maxscale
mysql -u maxscale_monitor -p -h 192.168.0.18 -P4006 192.168.0.18是maxscale 服务器,4006是cnf中配置的监听ip maxscale_monitor 是在主机上创建的账号
然后 在maxscale 运行
maxctrl list services
maxctrl list servers
查看连接数
[root@instance-0k9n9mw6 solf]# maxctrl list servers ┌─────────┬──────────────┬──────┬─────────────┬─────────────────┬──────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├─────────┼──────────────┼──────┼─────────────┼─────────────────┼──────┤ │ server1 │ 192.168.0.74 │ 3306 │ 1 │ Master, Running │ │ ├─────────┼──────────────┼──────┼─────────────┼─────────────────┼──────┤ │ server2 │ 192.168.0.75 │ 3306 │ 1 │ Slave, Running │ │ └─────────┴──────────────┴──────┴─────────────┴─────────────────┴──────┘ [root@instance-0k9n9mw6 solf]# maxctrl list services ┌────────────────────┬────────────────┬─────────────┬───────────────────┬──────────────────┐ │ Service │ Router │ Connections │ Total Connections │ Servers │ ├────────────────────┼────────────────┼─────────────┼───────────────────┼──────────────────┤ │ Read-Write-Service │ readwritesplit │ 1 │ 1 │ server1, server2 │ └────────────────────┴────────────────┴─────────────┴───────────────────┴──────────────────┘