MySQL 集群Cluster

目录

        一、MySQL 主从复制

        1.1 主从复制原理

        1.2 MySQL的扩展

        1.2.1 什么是读写分离

        1.2.2 为何读写分离

        1.2.3 何时要读写

        1.2.4 主从复制与读写分离

        1.2 主从复制过程

        1.3 主从复制相关线程

        1.4 复制功能文件

        二、模拟搭建mysql主从复制

        2.1 环境配置

        2.2 实验环境 

        2.3 搭建mysql主从复制 

        三、搭建Amoeba 实现读写分离

        3.1 环境配置

        3.2 实验配置

        3.2.1 配置Amoeba服务器

         3.2.2 主与服务器配置

        3.2.3 amoeba服务器配置


        一、MySQL 主从复制

        1.1 主从复制原理

        MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。

        binlog:binary log,主库中保存所有更新事件日志的二进制文件。binlog是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。在主库中,只要有更新事件出现,就会被依次地写入到binlog中,之后会推送到从库中作为从库进行复制的数据源。

        binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。 对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。

        在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。

        从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。 从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

        从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

        1.2 MySQL的扩展

        读写分离

        复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制

        1.2.1 什么是读写分离

        读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

        MySQL 读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。

        1.2.2 为何读写分离

        因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。但是数据库的“读”(读10000条数据可能只要5秒钟)。所以读写分离,解决的是,数据库的写入,影响了查询的效率。

        1.2.3 何时要读写

        数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

        1.2.4 主从复制与读写分离

        在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

        mysq支持的复制类型
(1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

        1.2 主从复制过程

 主从复制的工作过程:
1.Master节点的数据的改变记录成二进制日志(bin log),
2.当Master上的数据发生改变时,则将其改变写入二进制日志中。
3.开启一个slave服务线程传递给从服务器
4.Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件。
5.同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点本地的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

        1.3 主从复制相关线程

        主节点:

dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events

        从节点:

I/O Thread:向Master请求二进制日志事件,并保存于中继日志中

SQL Thread:从中继日志中读取日志事件,在本地完成重放

        1.4 复制功能文件

        master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等

        relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关系

        mariadb-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志

        二、模拟搭建mysql主从复制

        2.1 环境配置

(主)master服务器: 192.168.162.100   mysql5.7
(从)slave1服务器: 192.168.162.111     mysql5.7
(从)slave2服务器: 192.168.162.102    mysql5.7
Amoeba服务器: 192.168.162.121   jdk1.6、Amoeba
客户端 服务器: 192.168.162.122      mysql

        2.2 实验环境 

##关闭防火墙

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0

        2.3 搭建mysql主从复制 

##主服务器搭建时间同步
[root@localhost ~]#yum install ntp -y
[root@lppdff ~]# vim /etc/ntp.conf
server 127.127.162.0
fudge  127.127.162.0 stratum 8

##开启服务
[root@lppdff ~]# systemctl start ntpd

##从服务器安装同步服务(111)
[root@localhost ~]#yum install ntpdate -y
[root@localhost ~]# /usr/sbin/ntpdate 192.168.162.100
 5 Dec 15:32:10 ntpdate[2623]: the NTP socket is in use, exiting

##创建计划任务每30分钟同步一次
[root@localhost ~]# crontab -e
no crontab for root - using an empty one

*/30 * * * *  /usr/sbin/ntpdate 192.168.162.100

##从服务器时间同步
[root@localhost ~]# yum install ntpdate -y
##开启服务
[root@localhost ~]# systemctl start ntpd
##创建计划任务每30分钟同步一次
[root@localhost ~]# crontab -e
no crontab for root - using an empty one

*/30 * * * *  /usr/sbin/ntpdate 192.168.162.100

 

##主服务器中开启二进制日志
在mysqld末行插入

log-bin=master-bin
#开启二进制日志
binlog_format=MIXED
#二进制日志格式
log-slave-updates=true
#开启从服务器同步


##重启服务
[root@localhost ~]#systemctl restart mysqld.service 

##进入数据库
[root@lppdff system]# mysql -uroot -p123123


##授权
mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec

##查看节点日志位置
mysql> show master status;

 

 

##俩台从服务器开启中继
[root@localhost system]# vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

##重启数据库
[root@localhost system]# systemctl restart mysqld.service
##进入数据库
[root@localhost system]# mysql -uroot -p123123


##添加从服务器日志记录
mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1053;

##开启服务
mysql>start slave;

##查看服务线程
mysql>show slave status\G

##此线程必须为yes
#Slave_IO_Running: Yes
#Slave_SQL_Running: Yes

 

          验证

        在主服务器上创建数据库

        从服务器验证 

 

 

        三、搭建Amoeba 实现读写分离

        3.1 环境配置

(主)master服务器: 192.168.162.100   mysql5.7
(从)slave1服务器: 192.168.162.111     mysql5.7
(从)slave2服务器: 192.168.162.102    mysql5.7
Amoeba服务器: 192.168.162.121   jdk1.6、Amoeba
客户端 服务器: 192.168.162.122      mysql

        3.2 实验配置

        3.2.1 配置Amoeba服务器

##配置Amoeba服务器
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# 


##将安装包放入
[root@localhost opt]# ls
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin  rh

##拷贝文件
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@localhost opt]# cd /usr/local/
##添加执行权限
[root@localhost local]# chmod +x /usr/local/jdk-6u14-linux-x64.bin



[root@localhost local]#./jdk-6u14-linux-x64.bin
#一路回车到底,最后输入yes 自动安装

 

 

##修改环境变量
[root@localhost local]#vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin


##改名
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6
##刷新环境变量
[root@localhost local]# source /etc/profile

 

##解压amoeba安装包

##创建目录
[root@localhost opt]#mkdir /usr/local/amoeba
[root@localhost opt]#cd /opt/

##解压文件
[root@localhost opt]#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba

##添加执行权限
[root@localhost opt]#chmod -R 755 /usr/local/amoeba/

         3.2.2 主与服务器配置

##在主和从服务器添加记录,如果主从复制配置完成不需要从在添加
mysql> grant all on *.* to test@'192.168.162.%' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

        3.2.3 amoeba服务器配置

##备份配置文件
[root@localhost local]# cd amoeba/conf/

##备份全局配置文件
[root@localhost conf]# cp amoeba.xml amoeba.xml.bak

##备份数据库文件
[root@localhost conf]# cp dbServers.xml dbServers.xml.bak


 

##修改全局配置文件添加记录
[root@localhost conf]# vim amoeba.xml

 

 

##修改日志配置文件添加记录
[root@localhost conf]# vim dbServers.xml

          开启服务,验证

         客户机验证

##客户机使用数据库为mariadb
[root@localhost ~]#yum install mariadb mariadb-server.x86_64 -y

##登录
[root@localhost yum.repos.d]# mysql -uamoeba -p123123 -h 192.168.162.121 -P8066

         主从复制验证

##关闭服务
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

##开启日志 在主和从服务器上
mysql> set global general_log=1;

##在客户机添加记录
MySQL [lpp]> insert into a values(1,'abc',20,'man');

##在主查看日志
[root@lppdff ~]# cd /usr/local/mysql/data/
[root@lppdff data]# tail -f lppdff.log 


##在从服务器查看日志
[root@lppdff ~]# cd /usr/local/mysql/data/
[root@lppdff data]# tail -f localhost.log 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
连接 MySQL Cluster 集群可以通过两种方式:使用 MySQL Shell 或者使用 MySQL Connector/Net。以下是连接 MySQL Cluster 集群的步骤: ### 使用 MySQL Shell 连接 1. 打开 MySQL Shell,输入以下命令连接到 MySQL Cluster: ``` mysqlsh root@<ndb_mgmd_ip>:<ndb_mgmd_port> ``` 其中,`root` 是 MySQL 的用户名,`<ndb_mgmd_ip>` 是 MySQL Cluster Management Server 的 IP 地址,`<ndb_mgmd_port>` 是 MySQL Cluster Management Server 的端口号(默认为 1186)。 2. 输入密码登录 MySQL。 3. 输入以下命令查看 MySQL Cluster 集群节点的状态: ``` dba.getCluster().status() ``` 如果输出的信息包含了所有的 MySQL Cluster 节点,说明连接成功。 ### 使用 MySQL Connector/Net 连接 1. 在 Visual Studio 中创建一个新的 C# 项目。 2. 在项目中添加 MySQL Connector/Net。 3. 在代码中引入 MySQL Connector/Net 的命名空间: ``` using MySql.Data.MySqlClient; ``` 4. 使用以下代码连接到 MySQL Cluster: ``` string connectionString = "server=<ndb_mgmd_ip>;port=<ndb_mgmd_port>;database=<database_name>;uid=<username>;pwd=<password>"; MySqlConnection connection = new MySqlConnection(connectionString); connection.Open(); ``` 其中,`<ndb_mgmd_ip>` 是 MySQL Cluster Management Server 的 IP 地址,`<ndb_mgmd_port>` 是 MySQL Cluster Management Server 的端口号(默认为 1186),`<database_name>` 是要连接的数据库名称,`<username>` 是 MySQL 的用户名,`<password>` 是 MySQL 的密码。 5. 使用 `connection` 对象执行 SQL 查询等操作。 以上是连接 MySQL Cluster 集群的方法,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值