mysql集群(一)

1、mysql cluster

    结构: sql + data + mgm节点node

    原理mysql

    集群由3个概念redis

    1,sql节点  sql nodesql

    2,数据节点 data node数据库

    3,管理节点 ndb managerment服务器

    sql语句发送sql节点sql节点发往数据节点,再由管理节点完成数据节点的之间的同步。网络

    集群技术相对复杂,至少有3种节点,4台服务器才能完成。session

2、mysql replication

    结构: master + slavetcp

    一、主从复制

    master负责写,slave负责读,解决了数据库瓶颈问题测试

    原理

    1,主服务器运行语句,都产生一个二进制日志 binlog

    2,从服务器不断读取主服务器的binlog

    3,从主服务读取到的binlog,转换为自身可执行的relaylog

    4,执行relaylog

    实现步骤

    1,首先确保主服务器打开二进制日志功能

        主服务器一旦有数据变化,当即产生二进制日志

    2,从服务器也须要开启二进制日志和relay日志功能

        这样能够从主服务器读取binlog,并产生relaylog

    3,在主服务器创建一个从服务器的帐号,并授予数得上权限

    4,指定从服务对应的主服务器,开启从服务器

    具体实施

    虚拟机下有两台CentOS-6.7,IP为192.168.1.67(master)和192.168.1.83(slave)

    1,67作主服务器

    2,83作从服务器

    3,保证主从3306端口互通

    4,配置主服务器,打开binlog

        

        #给服务器起一个惟一的id,一般以局域网ip最后段命名

        server-id=67

        #开启二进制日志

        log-bin=mysql-bin

        #指定日志格式

        binlog-format=mixd

        注:binlog日志格式选择

            主服务器的日志格式用哪一种好?

            有 statement,row,mixed 3种,其中mixed是指前2种的混合。

            一、insert into xxtable values (x,y,z)

                影响:1行,且为新增1行,对于其余行没有影响。 

                这个状况,用row格式,直接复制磁盘上1行的新增变化。

            二、update xxtable set age=21 where name='sss'

                这个状况,通常也只是影响1行,用row也比较合适。

                以过年发红包,全公司的人,都涨薪100元。

            三、update xxtable set salary=salary+100

                这个语句带来的影响,是针对每一行的,所以磁盘上不少row都发生了变化。

                此处,适合就statment格式的日志。

            2种日志,各有各的高效的地方,mysql提供了mixed类型。

            能够根据语句的不一样,而自动选择适合的日志格式。

        重启mysql

        

        已经可以充当master服务器

    5,配置从服务器打开binlog和relaylog

        

        #给服务器起一个惟一的id,一般以局域网ip最后段命名

        server-id=83

        #开启二进制日志

        log-bin=mysql-bin

        #指定日志格式

        binlog-format=mixd

        #从服务器中继日志

        relay-log=mysql-relay

        #指定只读

        read-only=1

        重启从服务器

    6,在服务器上建立相应的复制帐号

        GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

        刷新权限

        flush privileges;

    7,在服务器经过语句指定要复制的主服务器(注意,能够一主多从,不可一从多主)

        CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000015',
MASTER_LOG_POS=3069;

    8,启动服务器功能

        start slave;

        注:经常使用语句

            show master status ; 查看master的状态, 尤为是当前的日志及位置

            show slave stattus; 查看slave的状态.

            reset slave ;  重置slave状态.

            start slave ; 启动slave 状态(开始监听msater的变化)

            stop slave; 暂停slave状态;

        配置错误展现

        

        错误分析

            一、网络不通
            二、密码不对
            三、pos不对

        解决方法:

            主服务器防火墙3306端口设置对外访问

            /sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

            /etc/rc.d/init.d/iptables save

            /etc/init.d/iptables restart

            /etc/init.d/iptables status

        配置完成

        

    9,测试

        CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

        CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '' COMMENT 'name',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

        INSERT INTO test (name) VALUES ('安大厦');

        mysql二进制日志

            /usr/local/mysql/var/

        查看最新的bin-log日志

            more mysql-bin.index

        查看master使用的bin-log日志

            show master status

    二、主主复制

        互为主从,解决读数据库写压力,不至于一台master宕机,网站不能访问,缺点 同步冲突

        大体思路:

            1,2台服务器都设置上2进制日志和relay日志

            2,都设置上replcation帐号

            3,都设置对方为本身的master

        具体实施:

            虚拟机下有两台CentOS-6.7,IP为192.168.1.67和192.168.1.83

            1,配置67服务器,配置binlog和relaylog

                #给服务器起一个惟一的id,一般以局域网ip最后段命名

                server-id=67

                #开启二进制日志

                log-bin=mysql-bin

                #指定日志格式

                binlog-format=mixd

               重启mysql

                

               67服务器上建立相应的复制帐号                

                GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

                在67服务器经过语句指定要复制的83服务器

                CHANGE MASTER TO \
MASTER_HOST='192.168.1.83',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000016',
MASTER_LOG_POS=1720;

                刷新权限

                flush privileges;

                start slave;

            2,配置83服务器,配置binlog和relaylog

                #给服务器起一个惟一的id,一般以局域网ip最后段命名

                server-id=83

                #开启二进制日志

                log-bin=mysql-bin

                #指定日志格式

                binlog-format=mixd

                

                在83服务器上建立相应的复制帐号                

                GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

                在83服务器经过语句指定要复制的67服务器

                CHANGE MASTER TO \
MASTER_HOST='192.168.1.67',
MASTER_USER='repl',
MASTER_PASSWORD='111111',
MASTER_LOG_FILE='mysql-bin.000017',
MASTER_LOG_POS=411;

                刷新权限

                flush privileges;

                start slave;

        主主复制下必定要注意避免的问题---------同步冲突

        2台mysql地位相等, 假如2个请求同时到达2台服务器,

            请求的A节点,  stu 的id为1

            请求的B 节点,  stu的id为1 ,

        同步--->冲突

        如何解决?

            让master1  1,3,5,7来增加

            另master2  2,4,6,8来增加

           master1:

set global auto_increment_increment = 2;#每步增加2

set global auto_increment_offset = 1;#从1开始增加

set session auto_increment_increment = 2;

set session auto_increment_offset = 1;

        注:global全局,session当次链接

            master2:

set global auto_increment_increment = 2;

set global auto_increment_offset = 2;

set session auto_increment_increment=2;

set session auto_increment_offset = 2;

        注:auto-increment-increment 和 auto-increment-offset 要写到配置文件 my.cnf 中,防止下次重启后失效。

         master1的my.cnf加入   

            auto_increment_increment=2  

            auto_increment_offset=1

        master2的my.cnf加入

            auto_increment_increment=2  

            auto_increment_offset=2

        查询默认auto_increment_increment 和 auto_increment_offset

        SHOW VARIABLES LIKE '%auto_inc%';

        操做后获得以下相似效果

        

        若是后期须要加服务器,这个办法就有限制了。

        咱们能够在业务逻辑上来解决,

        好比在racle 有sequnce,序列。

        序列每次访问,生成递增/递减的数据。

        以redis为例,咱们能够专门构建一个 global:userid

        每次PHP插入Mysql前,先 incr->global:userid,获得一个不重复的userid。

    三、被动主主复制

        避免了主主复制的缺点只是一台服务器写入,另外一台读取备份

          是指 2台服务器地位同样,但其中一台为只读,而且业务中也只写某1台服务器。

          好处: 若是供写入的服务器出了故障,能迅速的切换到从服务器,

              或者出于检修等目的,把写入功能切换到另外一台服务器也比较方便。

相关文章
相关标签/搜索