案例:MySQL 主从复制与读写分离

1.案例环境

一、准备五台主机

  • Master:操作系统CentOS 7.3x86_74、IP地址192.168.17.10。
  • Slave1:操作系统CentOS 7.3x86_74、IP地址192.168.17.20。
  • Slave2:操作系统CentOS 7.3x86_74、IP地址192.168.17.30。
  • Amoeba:操作系统CentOS 7.3x86_74、IP地址192.168.17.40。
  • Client:操作系统CentOS 7.3x86_74、IP地址192.168.17.50。

2.案例实现思路

(1)安装MySQL数据库。

(2)配置MySQL主从复制。

(3)安装并配置Amoeba。

(4)客户端测试读写分离。

3.案例实施

3.1 搭建MySQL主从复制

1.建立时间同步环境

在主节点上搭建时间同步服务器。

(1)安装NTP。

[root@master ~]# yum -y install ntp

 (2)配置NTP。

[root@master ~]# vim /etc/ntp.conf    ##添加如下两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

(3)重启服务并设置为开机启动。

[root@master ~]# systemctl restart ntpd
[root@master ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
[root@master ~]#

2.配置防火墙和SELinux。

在每台服务器上关闭firewalld或者在防火墙上开放指定的端口和服务。

[root@master ~]# systemctl stop firewallld
[root@master ~]# systemctl disable firewallld
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
[root@master ~]# setenforce 0

3.在从节点上进行时间同步

slvae1:
[root@slave1 ~]# yum -y install ntpdate
[root@slave1 ~]# ntpdate 192.168.17.10
15 Mar 10:43:44 ntpdate[18914]: adjust time server 192.168.17.10 offset 0.025335 sec
[root@slave1 ~]#
slave2:
[root@slave2 ~]# yum -y install ntpdate
[root@slave2 ~]# ntpdate 192.168.17.10
15 Mar 10:43:57 ntpdate[77169]: adjust time server 192.168.17.10 offset 0.026557 sec
[root@slave2 ~]#

4.安装MySQL数据库

在Master、Slave1、Slave2服务器上安装MySQL数据库。这里我提前安装过所以不做演示了,大家可以参考我之前的文章二进制安装MySQL数据库。

5.配置Master主服务器

(1)在/etc/my.cnf中修改或者增加下面内容。

[root@master ~]# vim /etc/my.cnf    ##增加如下内容
server-id=11
log-bin=master-bin
log-slave-updates=true

(2)重启MySQL服务

[root@master ~]# systemctl restart mysqld

(3)登录MySQL程序,给从服务器授权。

[root@master ~]# mysql -u root -p'123.123'
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      592 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql>

        其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave应从该节点上进行新的更新。

6.配置Slave从服务器

在Slave1、Slave2服务器上面分别执行下面步骤。

(1)在/etc/my.cnf中修改或者增加下面内容,这里要注意server-id不能相同。

slave1:
[root@slave1 ~]# vim /etc/my.cnf
server-id=22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
slave2:
[root@slave2 ~]# vim /etc/my.cnf
server-id=33
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

(2)两台从节点服务器分别重启MySQL服务。

slave1:
[root@slave1 ~]# systemctl restart mysqld
slave2:
[root@slave2 ~]# systemctl restart mysqld

(3)登录MySQL,两台从节点服务器都要配置同步。(这里演示一台)

[root@slave1 ~]# mysql -u root -p'123.123'
mysql> change master to master_host='192.168.17.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',maaster_log_pos=592;
Query OK, 0 rows affected, 2 warnings (0.01 sec) 

(4)启动同步。

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

(5)查看Slave状态,确保以下两个值为YES。

 mysql> show slave status\G;Slave_IO_Running: YesSlave_SQL_Running: Yes

7.验证主从复制结果

(1)在主、从服务器上登录MySQL。

[root@master ~]# mysql -u root -p'123.123'
mysql> show databases;

两台数据库执行结果应该相同。

(2)在主服务器上新建数据库db_test。

mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)

(3)在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)mysql>
3.2 搭建MySQL读写分离

1.在主机Amoeba上安装Java环境

因为Amoeba基于是jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin    ##这里我已经提前上传了文件
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin 
[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@amoeba ~]# 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@amoeba ~]# source /etc/profile
[root@amoeba ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
[root@amoeba ~]#

Java环境已配置成功。

2.安装并配置Amoeba软件

[root@amoeba ~]# mkdir /usr/local/amoeba
[root@amoeba ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/    ##我已经提前将压缩包上传了,所以直接解压
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@amoeba ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop    ##显示此内容说明Amoeba安装成功
[root@amoeba ~]#

3.配置Amoeba读写分离,两个Slave读负载均衡

(1)Master、Slave1、Slave2中开放权限给Amoeba访问。

mysql> grant all on *.* to test@'%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.01 sec)

(2)编辑amoeba.xml配置文件。

 [root@amoeba amoeba]# vim conf/amoeba.xml    ##修改第30行、32行以及115行、118行119行内容30       <property name="user">amoeba</property>    32       <property name="password">123456</property>115       <property name="defaultPool">master</property>118       <property name="writePool">master</property>
119       <property name="readPool">slaves</property>

(3)编辑dbServers.xml配置文件

[root@amoeba amoeba]# vim conf/dbServers.xml    ##找到如下行数内容并进行更改26                         <property name="user">test</property>29                         <property name="password">123.com</property>45         <dbServer name="master"  parent="abstractServer">46                 <factoryConfig>47                         <!-- mysql ip -->48                         <property name="ipAddress">192.168.17.10</property>49                 </factoryConfig>50         </dbServer>51 52         <dbServer name="slave1"  parent="abstractServer">53                 <factoryConfig>54                         <!-- mysql ip -->55                         <property name="ipAddress">192.168.17.20</property>56                 </factoryConfig>57         </dbServer>58 59         <dbServer name="slave2"  parent="abstractServer">60                  <factoryConfig>61                           <!-- mysql ip -->62                          <property name="ipAddress">192.168.17.30</property>63                  </factoryConfig>64          </dbServer>72                         <property name="poolNames">slave1,slave2</property>

(4)配置无误后,可以启动Amoeba软件,其默认端口为tcp 8066。

[root@amoeba amoeba]# bin/amoeba start&
[root@amoeba amoeba]# netstat -anpt | grep java
tcp6       0      0 :::8066                 :::*                    LISTEN      78725/java          
tcp6       0      0 127.0.0.1:8707          :::*                    LISTEN      78725/java          
[root@amoeba amoeba]#

4.测试

(1)在Client主机上。

[root@client ~]# yum -y install mariadb

然后可以通过代理访问MySQL

[root@client ~]# mysql -u amoeba -p123456 -h 192.168.17.50 -P8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failedYour MySQL connection id is 1651716188
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191)at com.meidusa.amoeba.net.poolable.GenericObjectPool.borrowObject(GenericObjectPool.java:381)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.startSession(CommandMessageHandler.java:633)at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:123)at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2.run(MysqlClientConnection.java:291)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:619)
MySQL [(none)]>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDOJ 2048

神、上帝以及老天爷 Problem Description HDU 2006’10 ACM contest的颁奖晚会隆重开始了&#xff01; 为了活跃气氛&#xff0c;组织者举行了一个别开生面、奖品丰厚的抽奖活动&#xff0c;这个活动的具体要求是这样的&#xff1a; 首先&#xff0c;所有参加晚会的人员都将一…

python | pop()和remove()方法

pop()与remove()方法都是删除列表中的元素&#xff0c;但删除的位置不同 ① pop()&#xff1a;删除列表中的最后一个元素 ② remove()&#xff1a;可以删除列表中的某一个值 如果某一个值有多个&#xff0c;则删除第一个&#xff08;即最左边出现的那一个&#xff09; li[…

【WPF】Canvas的Path画线 颜色值偏差和面积不准确

图像中左上角2个红色线段 颜色值有偏差&#xff0c;且线段高度不准确&#xff08;我设置的是Red,1&#xff09;。 解决方案&#xff1a; 1、PathGeometry PathFigure LineSegment 2、Stretch设置Fill <Path Stretch"Fill" Stroke"Red"…

Axure软件安装汉化教程

Axure软件安装汉化教程 一、准备教程 下载Axure的软件&#xff0c;并解压打开 二、安装过程 双击Axure软件的运行程序&#xff0c;修改安装程序的路径&#xff0c;默认下一步即可。 三、软件汉化 打开Axure的软件安装路径&#xff0c;将汉化包复制粘贴进入到Axure RP 9安装…

C语言从入门到实战————数组和指针的深入理解

前言 在C语言中&#xff0c;数组和指针有的密切得联系&#xff0c;因为数组名本身就相当于一个指针常量。指针是一个变量&#xff0c;专门用来存储另一个变量的内存地址&#xff0c;通过这个地址可以访问和操作该变量的值&#xff0c;同时也包括数组。数组是一组连续存储的同类…

什么是云?公共云,私有云,混合云分别是什么?云概念的提出 白话总结

一、什么是云 “云” 通常是指云计算环境&#xff0c;非本地化的计算环境。即我们没有环境或者机器&#xff0c;那么可以将我们的提供的服务部署到云计算环境&#xff0c;而这个环境是由其他运营商来提供和维护。 也可以理解为我们将我们的产品或者计算服务部署在远端网络。 …

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …

QT信号与槽实现方式

1、第一种实现方式 在QT开发工具UI界面先拖入按钮&#xff0c;然后鼠标右键拖入按钮&#xff0c;点击选中槽&#xff0c;在页面选着需要的信号&#xff0c;然后OK&#xff0c;随即将会跳转到类的.cpp文件&#xff0c;&#xff08;这种UI代码结合的方式&#xff0c;会自动去绑定…

kruakal算法(P3603,3366)

[图论与代数结构 301] 最短树问题_1 - 洛谷 分三步,输入,排序,并查集连接n次 using ll long long; constexpr int N 2e5 5; constexpr int M 5e5 5; ll ans, sum, n, m;struct DSU {std::vector<int> f, siz;DSU() {}DSU(int n) {init(n);}void init(int n) {f.re…

ArrayList 是线程安全的么?

1、典型回答 ArrayList 是非线程安全的数据结构 多线程环境下&#xff0c;如果多个线程同时对同一个 ArrayList 进行添加、删除或修改操作&#xff0c;可能会导致数据不一致或发生异常。这是因为&#xff0c;ArrayList 在内部实现时&#xff0c;并没有添加任何线程同步的机制…

服务器做raid几好

服务器应该做RAID几?RAID是一种将多块独立的硬盘存储数据跟其它硬盘进行存储管理的方法。 RAID是一种存储性能、数据安全和校验等技术,可用于提高数据存储的安全性和可靠性。由于去中心化的方式,它可以保证数据 在所有的硬盘中只有一个硬盘,因为存储性能不需要像硬盘那样根据需…

如何在项目中应用“API签名认证”

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 为什么需要AP…

windows脚本启动程序的方式

1. 获取管理员权限并运行程序 powershell -command "Start-Process -Verb RunAs -FilePath xxx.exe -ArgumentList parameters......" 2. 无须管理员权限 powershell -command "Start-Process -FilePath xxx.exe -ArgumentList parameters......"

ORBSLAM3与GPS进行松组合

文章目录 预备知识orbslam3vins-fusion中的GPS融合策略数据准备环境准备更改配置globalOptNode.cpp代码运行融合结果预备知识 orbslam3 ORBSLAM3 是一个最新的视觉SLAM(Simultaneous Localization and Mapping)系统,它建立在成功的 ORBSLAM2 系统的基础上,引入了多种新的…

在SwiftUI中使用Buider模式创建复杂组件

在SwiftUI中使用Buider模式创建复杂组件 我们在前面的博客闲聊SwiftUI中的自定义组件中聊到了如何在SwiftU中创建自定义组件。 在那里&#xff0c;我们创建了一个非常简单的组件RedBox&#xff0c;它将展示内容增加一个红色的边框。 RedBox非常简单&#xff0c;我们用普通的方…

Java面试题总结12MySQL之MVCC和主从复制原理

什么是MVCC 即多版本并发控制&#xff0c;读取数据时通过一种类似快照的方式将数据保存下来&#xff0c;这样读写与写锁就不会 冲突&#xff0c;不同的事务session只会看到自己特定版本的数据&#xff0c;版本链 MVCC只会在READ COMMITTED(已提交读)和REPEATABLE READ(可重复…

腾讯春招后端一面(算法篇)

前言&#xff1a; 哈喽大家好&#xff0c;前段时间在小红书和牛客上发了面试的经验贴&#xff0c;很多同学留言问算法的具体解法&#xff0c;今天就详细写个帖子回复大家。 因为csdn是写的比较详细&#xff0c;所以更新比较慢&#xff0c;大家见谅~~ 就题目而言&#xff0c;…

深度学习_GoogLeNet_4

目标 知道GoogLeNet网络结构的特点能够利用GoogLeNet完成图像分类 一、开发背景 GoogLeNet在2014年由Google团队提出&#xff0c; 斩获当年ImageNet(ILSVRC14)竞赛中Classification Task (分类任务) 第一名&#xff0c;VGG获得了第二名&#xff0c;为了向“LeNet”致敬&#x…

Java应用卡死 生产故障深度分析与排查实战

一、引言 在实际的生产环境中&#xff0c;我们经常会遇到Java应用出现线程阻塞进而导致服务卡死的问题。这种问题不仅影响用户体验&#xff0c;严重时甚至会导致整个系统崩溃。本文将通过一次真实的生产故障案例&#xff0c;详解从发现异常到定位原因的详细步骤&#xff0c;并…

Linux学习之网络

目录 认识协议 网络协议初始 协议分层 OSI七层模型 TCP/IP的四层模型 数据包封装和分用 以太网通信 ip地址与MAC地址 网络编程套接字 端口号&#xff08;port&#xff09; 认识协议 网络字节序 socket接口 网络的产生是计算机历史的必然性&#xff0c;是计算机发展…