MySQL的分布式架构

分机器:分库

1.配置SSH

2.防火墙,iptables(阻止端口),selinux(篡改)

service iptables stop

3.mysql当中都需要开放一个远程用户

grant all privileges on *.* to 'hal'@'%'  identified by '123456' with grant option;

4.找到[mysqld]模块文件

mysql的主从复制传输的就是一个二进制的文件

做读写分离,分散数据库的压力,也可以实时的备份数据

主服务器把:自己的开放账号,IP地址,端口号,二进制文件的名称,口令给从服务器.

从服务器把主服务器的信息记录在配置项中,配置完成以后,从服务器会去访问主服务器,会把自己的IP,端口,给留在主服务器中.

当主服务器发生动作性的操作,主服务会通知从服务器,从服务从新连接主服务器,把binlog文件拷贝过来,执行binlog当中的语句.

当从服务器中发生动作性的操作以后,主服务器不会受到影响,其它的从服务器也不会受到影响

1.文件配置的过程

  • 1.先找到mysql的配置文件
找到[mysqld]模块
查看到数据文件的存储位置 例如/data/mysql

进入到数据存储目录中查看log日志的文件前缀

配置log-bin=日志的文件前缀
配置server-id=ip地址不加上点 (备注:不能重复)
配置的是黑洞引擎log-slave-updates=1(备注:将二进制文件同步)(级联复制)

#master必须要配置的
binlog-do-db=test  #需要同步的数据库
binlog-ignore-db=mysql #避免同步的数据库
#slave必须要配置的
replicate-do-db=test  #需要复制的数据库
replicate-ignore-db=mysql  #避免复制mysql库
  • 2.重启服务器
service mysqld restart

systemctl stop mysqld.service
systemctl start mysqld.service
  • 3.进入到终端
#主服务器
show master status\G   #显示当前的主服务器状态
*************************** 1. row ***************************
             File: mysql-bin.000059        #从服务器拷贝当前的文件
         Position: 154                                #对接口令
     Binlog_Do_DB:                               #同步哪个数据中的数据,值为空复制所有的库
 Binlog_Ignore_DB:                           #避免同步那个数据中的数据
Executed_Gtid_Set:
#从服务器
stop slave;  #停止从服务器的运行
#配置项
change master to
master_host='10.11.52.111' ,
master_user='hal',
master_password='123456',
master_log_file='mysql-bin.000022',
master_log_pos=3064;
#开启从服务
start slave;
#查看从服务器的状态
show slave status\G;
######下个两个配置项必须是yes##########
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#innodb引擎配置
###############################服务器#################
log-bin=mysql-bin
#将主服务器的log文件更新到mysql-bin中
log-slave-updates=1
server-id = 101152106
#master必须要配置的
binlog-do-db=test  #需要同步的数据库
binlog-ignore-db=mysql #避免同步的数据库
######################################################

default_storage_engine = InnoDB
#blackhole引擎配置
###############################服务器#################
log-bin=mysql-bin
#将主服务器的log文件更新到mysql-bin中
log-slave-updates=1
server-id = 101152105
#master必须要配置的
binlog-do-db=test  #需要同步的数据库
binlog-ignore-db=mysql #避免同步的数据库
#slave必须要配置的
replicate-do-db=test  #需要复制的数据库
replicate-ignore-db=mysql  #避免复制mysql库
#默认使用BLACKHOLE
default-storage-engine = BLACKHOLE
#不使用innodb
skip-innodb
######################################################

#default_storage_engine = InnoDB
#default-storage-engine = MyISAM
#myisam服务器
#从服务器引擎
log-bin=mysql-bin
#将主服务器的log文件更新到mysql-bin中
log-slave-updates=1  #级联复制的时候使用的
server-id = 101152103
#slave必须要配置的
replicate-do-db=test  #需要复制的数据库
replicate-ignore-db=mysql  #避免复制mysql库
#默认使用
default-storage-engine = myisam
#不使用innodb
skip-innodb
##################################################
#default_storage_engine = InnoDB

2.不同的主从复制

  • 一主一从

mysql最大支持分布式节点数 mysql可以分布式吗_分布式

  • 互为主从

mysql最大支持分布式节点数 mysql可以分布式吗_mysql最大支持分布式节点数_02

  • 级联复制

mysql最大支持分布式节点数 mysql可以分布式吗_数据库_03

  • 黑洞优化复制

mysql最大支持分布式节点数 mysql可以分布式吗_linux_04

主从面试题

不出故障:

  • 配置黑洞引擎,让从服务器链接黑洞,从而给主服务器缓解压力
  • 级联复制,一个主服务器有一个从服务器,从服务器下面还有一个从服务器,从服务器下面可以添加3-5个服务器.

3.读写分离

为什么要用读写分离?

  • 面对巨大的访问压力,单台服务器的性能有瓶颈,需要分担负载

读写的方式:

  • 1.在代码当中去配置:
  • 应用程序内部使用代码的逻辑判断进行分割,代码模块只要被搭建了就能使用
  • 减少了一定的部署困难
import pymysql

class MyCat():
    def __init__(self,sql):
        self.sql = sql.strip()

    def query(self):
        #select * from table_name;
        head = self.sql.split(' ')[0]
        if head == 'select':
            return self.read()
        else:
            return self.write()

    def write(self):
        conn = pymysql.connect(host='10.11.52.106', user='hal', passwd="123456",
                         db='test', port=3306)
        cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
        try:
            cursor.execute(self.sql)
            conn.commit()
            return [{'res':'ok'}]
        except Exception as e:
            conn.rollback()
            return  '语句执行失败:\n'+str(e)
        finally:
            cursor.close()
            conn.close()

    def read(self):
        conn = pymysql.connect(host='10.11.52.103', user='hal', passwd="123456",
                         db='test', port=3306)
        cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
        try:
            cursor.execute(self.sql)
            conn.commit()
            result = cursor.fetchall()
            return result
        except Exception as e:
            conn.rollback()
            print('查询失败:\n'+str(e))
        finally:
            cursor.close()
            conn.close()


sql = "insert into `qwer1` set id=2"
action = MyCat(sql)
print(action.query())
  • 2.中间件层实现

mysql最大支持分布式节点数 mysql可以分布式吗_mysql_05

  • 管理起来比较方便(mycat,java编写的)
  • 搭建非常的繁琐
准备jdk
准备mycat
#下载
scp root@10.11.52.106:/root/mycat.tar.gz .
scp root@10.11.52.106:/root/jdk8.tar.gz .
    
#上传
scp mycat.tar.gz root@101.123.186.200:/root/.
jdk配置安装
#解压 
tar fx jdk8.tar.gz -C /usr/java
#进入目录
cd /usr/java
#修改名称
mv jdk1.8.0_161/  jdk1.8.0
#配置环境变量
vim /etc/profile +

##########################javaenv############################
JAVA_HOME=/usr/java/jdk1.8.0
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin/
export JAVA_HOME CLASSPATH  PATH

#刷新
source /etc/profile
mycat的配置和安装
#解压
tar fx mycat.tar.gz -C /usr/local/
#切换目录
cd /usr/local/mycat
#主要目录介绍
conf-------->配置项
logs-------->查看mycat的运行状态

#配置环境变量
vim /etc/profile +

########################mycatenv##############################
MYCAT_HOME=/usr/local/mycat
PATH=$PATH:$MYCAT_HOME/bin/
export MYCAT_HOME PATH

#刷新
source /etc/profile

#条件
vim /etc/hosts  #本地DNS
#10.11.52.105 Centos7

配置登录的用户信息

#配置mycat连接服务器
vim /usr/local/mycat/conf/server.xml
#
</system>
#配置用户名
        <user name="root">
        #密码
                <property name="password">123456</property>
        #可以访问的库
                <property name="schemas">test</property>
        </user>

        <user name="hal">
              <property name="password">123456</property>
                <property name="schemas">test</property>
       #读写权限
                <property name="readOnly">false</property>
        </user>

4.高可用的主从(故障切换)

mysql最大支持分布式节点数 mysql可以分布式吗_数据库_06

虚拟冗余路由配置

keepalived的安装

yum install keepalived -y
#配置文件路径
vim /etc/keepalived/keepalived.conf

配置项

#主机器配置
global_defs {
	#出故障了把信息发给谁,邮件
   notification_email {
      	123456@qq.com
   }
   #用谁的邮件发送
   notification_email_from pwd.654321@qq.com
   #smtp邮件服务器
   smtp_server smtp.qq.com
   #邮件如果30秒内没有发出去
   smtp_connect_timeout 30
 #昵称
   router_id lvs_1   
}
#router_id
vrrp_instance lvs_1 {
	#确定主机身份
    state MASTER
    #绑定使用的网卡,可以使用ifconfig来查看
    interface ens33
     #路由id,要求主从相同(备注:如果不相同,会裂脑)
    virtual_router_id 1
    #权重大的为主 
    priority 100
    #故障切换需要消耗的时间 ,单位是秒
    advert_int 1
    #主机的口令,两边必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟的路由地址,在公网中的话,需要多使用一张网卡,可以多接入一个空闲的ip
    #局域网中空闲的ip很多
    virtual_ipaddress {
        10.11.52.200
        10.11.52.201
        10.11.52.202
    }
}
#从机器
global_defs {
	#出故障了把信息发给谁,邮件
   notification_email {
      	123456@qq.com
   }
   #用谁的邮件发送
   notification_email_from pwd.654321@qq.com
   #smtp邮件服务器
   smtp_server smtp.qq.com
   #邮件如果30秒内没有发出去
   smtp_connect_timeout 30
 #昵称
   router_id lvs_2   
}
#router_id
vrrp_instance lvs_2 {
	#确定主机身份
    state BACKUP
    #绑定使用的网卡,可以使用ifconfig来查看
    interface eth0
     #路由id,要求主从相同(备注:如果不相同,会裂脑)
    virtual_router_id 1
    #权重大的为主 
    priority 99
    #故障切换需要消耗的时间 ,单位是秒
    advert_int 1
    #主机的口令,两边必须一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟的路由地址,在公网中的话,需要多使用一张网卡,可以多接入一个空闲的ip
    #局域网中空闲的ip很多
    virtual_ipaddress {
        10.11.52.200
        10.11.52.201
        10.11.52.202
    }
}

启动keepalived

service keepalived start

如何检验配置是否成功

ip addr #获取当前的ip   也可以获取代理ip