centos MySQL主从配置 ntsysv chkconfig setup命令 配置MySQL 主从 子shell MySQL备份 kill命令 pid文件 discuz!论坛数据库读写分离 双主搭建 mysql.history 第二十九节课

centos  MySQL主从配置 ntsysv   chkconfig  setup命令  配置MySQL 主从 子shell  MySQL备份  kill命令  pid文件  discuz!论坛数据库读写分离  双主搭建   mysql.history   第二十九节课

搭建主从过程中先要slave stop   搭建好之后再slave start避免出错

ntsysv:图形界面服务管理工具
chkconfig:命令行服务管理工具
setup命令:图形界面管理工具

上半节课

ntsysv
chkconfig
setup命令
配置MySQL 主从

下半节课

子shell
MySQL备份
kill命令
pid文件
discuz!论坛数据库读写分离

双主搭建
mysql.history

1. MySQL主从原理以及应用场景MySQL的Replication原理非常简单,总结一下:
每个从仅可以设置一个主。
主在执行sql之后,记录二进制log文件(bin-log)。
从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。
从这几条Replication原理来看,可以有这些推论:
主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
如果主从的网络断开,从会在网络正常后,批量同步。
如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。
一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。
如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

可以应用在读写分离的场景中,用以降低单台MySQL服务器的I/O
可以实现MySQL服务的HA集群
可以是1主多从,也可以是相互主从(主主)

说明: 以下文档为在同一个机器上,配置两个mysql服务,在我们上课的时候,会用两台单独的机器来演示,但步骤基本上一样。

2. 安装、配置MySQL
参考之前步骤搭建MySQL服务
为了做实验方便,我们在同一台机器上配置两个MySQL服务(跑两个端口)
cd /usr/local/; cp -r mysql mysql_2; cd mysql_2;
初始化mysql2: ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2
拷贝配置文件:cp /etc/my.cnf ./my.cnf
修改配置文件相关参数:vim my.cnf #更改port 以及 socket
启动:/usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &
若开机启动它,需加入到 /etc/rc.local中

3. 配置主从准备工作
设定mysql_2 为主端口3307,mysql为从端口为3306
在主上创建测试库: create database db1;
然后导出主的mysql库数据然后导入给db1
mysqldump -uroot -S /tmp/mysql2.sock mysql > 123.sql ;
mysql -uroot -S /tmp/mysql2.sock db1 < 123.sql

yum install -y openssh-clients   //两边都要安装
yum install -y rsync
cd /data/mysql
rsync -av blog root@192.168.21.112:/data/mysql/ //blog是一个目录
或者
rsync -av root@192.168.21.112:/data/mysql/blog /data/mysql/ //blog是一个目录

4. 配置主(master)
vim /usr/local/mysql_2/my.cnf #修改或添加:
server-id=1
log-bin=mysql-bin
两个可选参数(2选1):
binlog-do-db=db1,db2 #需要同步的库
binlog-ignore-db=db1,db2 #忽略不同步的库
修改配置文件后,重启mysql_2
pid=`ps uax |grep mysql2.sock |grep -v grep |awk '{print $2}'` ; kill $pid; cd /usr/local/mysql_2/bin/; ./mysqld_safe --defaults-file=../my.cnf --user=mysql &
设置root密码:mysqladmin -u root -S /tmp/mysql2.sock password '123456'
mysql -u root -S /tmp/mysql2.sock -p'123456'
grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123123';
flush tables with read lock;
show master status; #一定要记住前两列的内容,一会会用到

5. 设置从(slave)
vim /etc/my.cnf #修改或增加
server-id = 2 #这个数值不能和主一样
可选参数:replicate-do-db=db1,db2 和 replicate-ignore-db=db1,db2 #意义同主的那两个可选参数  这个不用配置 因为主已经配置了
service mysqld restart
拷贝主的db1库数据到从:mysqldump -uroot -S /tmp/mysql2.sock -p123456 db1 > db1.sql; mysql -uroot -p -e "create database db1"; mysql -uroot -p db1 < db1.sql
mysql -uroot -p #登陆从的mysql
slave stop;
change master to master_host='127.0.0.1', master_port=3307, master_user='repl', master_password='123123', master_log_file='mysql-bin.000006', master_log_pos=474952;
slave start;
主上: mysql -uroot -S /tmp/mysql2.sock -p123456 -e "unlock tables"
从上查看从的状态: show slave status\G;

6. 测试主从
主上清空db1库的db表 :use db1; select count(*) from db"; truncate table db;
进入slave,查看db1库db表: use db1; select count(*) from db";
主上删除表db: drop table db;
从上看db表不存在了
建议: MySQL主从机制比较脆弱,谨慎操作。如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slave start.

#查看当前所在库
select database(); create database www; use www;
#复制 粘贴
show create table aming.pre_forum_post\G; #可以看到www库下新建的表pre_forum_post
show tables;

扩展学习:
mysql主从心得整理 http://wangwei007.blog.51cto.com/68019/965575
mysql主从问题集 http://blog.chinaunix.net/uid-8786588-id-3771613.html
mysql主从延迟 http://f.dataguru.cn/thread-461916-1-1.html
主从延迟原因PPT http://meeting.zhdba.com/style/2012atcc/ppt/mysql-arc.ppsx
mysql 主主 http://luoweiro.blog.51cto.com/2186161/658550
mysql-proxy 实现读写分离 http://my.oschina.net/barter/blog/93354
atlas相关 http://www.oschina.net/p/atlas
mysql一主多从 http://blog.sina.com.cn/s/blog_4c197d4201017qjs.html
cobar实现分库分表 http://blog.csdn.net/huoyunshen88/article/details/37927553
mysql分库分表方案 http://my.oschina.net/ydsakyclguozi/blog/199498
mysql架构演变 http://www.aminglinux.com/bbs/thread-8025-1-1.html


子shell

hostname slave ,改主机名,然后执行bash命令,就可以看到新的主机名[root@slave ~]


MySQL备份

myisam引擎可以直接拷贝文件夹/目录过去别的机器的mysql数据目录下,重启mysql就可以看到数据库
但是innodb不能这样做,一定要通过mysqldump  加single-transaction或者xtrabackup
Windows下没有xtrabackup工具,所以Windows下只能用myisam引擎,xcopy定时拷贝文件夹
或者停机,然后xcopy拷贝innodb引擎的数据库,然后重新打开mysql服务


kill命令

killall mysqld:不是强制杀mysql  如果是同一机器多实例mysql 会杀死全部mysql实例 
kill -9 pid:强制杀mysql
pkill command:不是强制杀mysql
pkill 对应的是COMMAND


pid文件

改了hostname之后,主机名变了,mysql的data目录下(主机名.pid)变了和(主机名的.err)变了,导致mysql启动不起来

原因:因为pid文件需要实现touch,但是因为主机名变了,mysql找不到pid文件,所以需要touch或者cp原来的pid文件

解决方法:将aminglinux.pid cp一下,cp aminglinux.pid slave.pid,然后restart mysql


discuz!论坛数据库读写分离

discuz!论坛使用的是DAL类型的读写分离,主的ip和从的ip都写在discuz!论坛的配置文件里面,程序代码会跟根据配置文件进行主从读写分离


双主搭建
双主产生死循环
避免双主产生死循环这种情况,在my.cnf里增加
两个主都要开binlog,在一台主上更新,另一台主会反映出更新,另一台主上的更新,在另一台主上也会反映出更新,反正无论哪边更新两边都可以反映更新,这就是双主

主上
auto-increment-increment = 2 //每次增长2
auto-increment-offset = 1 //设置自动增长的字段的偏移量,即初始值为1
从上
auto-increment-increment = 2 //每次增长2
auto-increment-offset = 2 //设置自动增长的字段的偏移量,即初始值为2注:二者都只有server-id不同和 auto-increment- offset不同
auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2。


搜索一下mysql.history,mysql执行过的命令
grep 'ss' mysql.history

f

上一篇:网站建设如何做到吸引用户的心?


下一篇:JAVA 设计模式 状态模式