Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33091
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 151
  • 用 户 组: 普通用户
  • 注册时间: 2017-04-07 23:15
个人简介

一步一个脚印,扎扎实实投资自己。

文章分类

全部博文(14)

文章存档

2017年(14)

我的朋友

分类: Mysql/postgreSQL

2017-10-16 22:57:36

环境准备:
Ubuntu 16.04.1 LTS
    master:192.168.0.241
    slave1:192.168.0.242
    slave2:192.168.0.243
mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz(二进制版)

结构图:

备注:
1、mysql为啥选用二进制版?就是因为二进制版经过了gcc优化,而且免去了编译过程,搭建快捷。
2、啥年代了还用5.6,为啥不用5.7以上版本?因为刚好搭建环境要用5.6,5.7安装类似,就懒得再写了。
3、由于5.6的binlog重现机制是实例中每个库单线程进行,因此如果主实例中同步的某个库如果有大量并发写,那么binlog重现还是会跟不上,导致second behand master延迟增大。要解决此坑,请升级到mysql5.7以上版本

用root权限安装二进制版mysql: 
  1. sudo -i
  2. apt-cache search libaio
  3. apt-get install libaio1
  4. tar -zxf /tmp/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz -C /opt/
  5. ln -s /opt/mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
  6. groupadd mysql
  7. useradd -r -g mysql -s /bin/false mysql
  8. chown -Rf mysql:mysql /usr/local/mysql/
  9. /usr/local/mysql/scripts/mysql_install_db --user=mysql
  10. ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
  11. ln -s /usr/local/mysql/my.cnf /etc/my.cnf
/etc/profile文件最后添加以下mysql命令路径
  1. PATH=$PATH:/usr/local/mysql/bin
启动
  1. source /etc/profile
  2. /etc/init.d/mysql.server start
设定初始选项 
  1. /usr/local/mysql/bin/mysql_secure_installation
  1. Enter current password for root (enter for none):    #初始空密码,回车即可
  2. Set root password? [Y/n] y    #之后输入两次新密码
  3. Remove anonymous users? [Y/n] y
  4. Disallow root login remotely? [Y/n] y
  5. Remove test database and access to it? [Y/n] y
  6. Reload privilege tables now? [Y/n] y
关闭mysql(为了预防配置修改后mysql不能正常restart的情况)
  1. /etc/init.d/mysql.server stop
修改my.cnf配置文件
  1. [mysql]
  2. default_character_set = utf8
  3. [mysqld]
  4. basedir = /usr/local/mysql
  5. datadir = /usr/local/mysql/data
  6. port = 8306
  7. server_id = 1    #每台机器不同且不能重复,master为1,slave1为2,slave2为3
  8. socket = /tmp/mysql.sock
  9. pid-file = /usr/local/mysql/mysql.pid
  10. character_set_server = utf8
  11. lower_case_table_names = 1    #表忽略大小写
重新启动mysql 
  1. /etc/init.d/mysql.server start
如果重启报错下图错误,请执行chown mysql:mysql /usr/local/mysql后再启动


主从同步设置: 
master库设置:
创建同步用户
  1. CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
  2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
/etc/my.cnf配置文件增加binlog相关配置
  1. log-bin = /logs/bin-logs/my-bin    #binlog位置与抬头,确保mysql用户对/logs/bin-logs有写权限
  2. binlog_format = ROW    #binlog记录模式
  3. sync_binlog = 0    #多少记录变更写入一次binlog,0为系统判断,1为每条都写入,1以上类推
  4. expire_logs_days = 90    # binlog自动清理天数
  5. innodb_flush_log_at_trx_commit = 2    #每次提交事务log_buffer写入logfile,并且logfile每秒写入磁盘1次
  6. log_bin_trust_function_creators= 1    #binlog是否允许含函数操作数据
重启master的mysql
  1. /etc/init.d/mysql.server restart
登录master的mysql查看有哪些binary log文件及大小(此步骤可略过)
  1. show binary logs;

添加只读锁,并查看当前binary log状态与位置
  1. flush table with read lock;
  2. show master status;
记下file与position值设置在slave1数据库的change master中

slave1库设置:
/etc/my.cnf配置文件增加binlog相关配置(因为slave1要作为slave2的master因此开了binlog)
  1. log-bin = /logs/bin-logs/my-bin
  2. binlog_format = ROW
  3. sync_binlog = 0
  4. expire_logs_days = 90
  5. innodb_flush_log_at_trx_commit = 2
  6. slave_parallel_workers = 4    #主从同步线程数,建议设置成cpu倍数
  7. log_bin_trust_function_creators= 1
  8. log_slave_updates=on
重启slave1的mysql
  1. /etc/init.d/mysql.server restart
登录slave1的mysql设置master信息
  1. change master to
  2. master_host='192.168.0.241',
  3. master_user='repl',
  4. master_password='repl',
  5. master_port=8306,
  6. master_log_file='my-bin.000002',
  7. master_log_pos=120;
启动slave ,并查看主从状态
  1. start slave;
  2. show slave status\G;
能看到下图状态说明主从同步设置完成

登录master解除只读锁
  1. unlock tables;

slave1作为slave2主库设置: 
登录slave1数据库,添加同步用户
  1. CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
  2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  3. flush privileges;
添加只读锁,并查看当前binary log状态与位置
  1. flush table with read lock;
  2. show master status;
记下file与position值设置在slave2数据库的change master中

slave2库/etc/my.cnf配置文件设置(优化slave性能)
  1. innodb_flush_log_at_trx_commit = 2
  2. slave_parallel_workers = 2
登录slave2的mysql设置master信息
  1. change master to
  2. master_host='192.168.0.242',
  3. master_user='repl',
  4. master_password='repl',
  5. master_port=8306,
  6. master_log_file='my-bin.000002',
  7. master_log_pos=478;
slave2启动slave 
  1. start slave;
登录slave1解除只读锁
  1. unlock tables;

下面备注几个主从相关的命令
跳过同步报错(实际分号分隔了三条命令)
stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;start slave;
不同步某个库
replicate-ignore-db = 库名
不同步某张表,可以加匹配字符例如:mysql.%
replicate-ignore-table = 库名.表名
跨库同步某张表,可以加匹配字符例如:mysql.%
replicate-wild-do-table = 库名.表名
replicate-wild-ignore-table=db_name.%
如果时区不能修改为UTC,SLAVE机器报时区错误,登录后 set time_zone='UTC'也报错,那么试试下面的命令
mysql_tzinfo_to_sql /usr/share/zoneinfo |  mysql -u root -S /usr/local/mysql/sock/mysql.sock mysql

完整去掉主从同步配置(网上不好找哦):
  1. /etc/init.d/mysql.server stop
  2. rm -rf /data/mysql/{master.info,mysql-relay-bin.*,relay-log.info}
阅读(463) | 评论(0) | 转发(0) |
0

上一篇:redis+sentinel高可用

下一篇:mongodb高可用

给主人留下些什么吧!~~