首页 > 免root版 > gg修改器授权root_gg修改器授权管理
gg修改器授权root_gg修改器授权管理
  • gg修改器授权root_gg修改器授权管理

  • 大小:12.27MB日期:2024-04-26 13:45:06
  • 语言:简体中文系统:Android
绿色无毒,安全可靠!部分设备误报拦截请通过!

应用详情

大家好,今天小编为大家分享关于gg修改器授权root_gg修改器授权管理的内容,赶快来一起来看看吧。

案例:Mysql读写分离

技能目标:

· 熟悉MySQL主从复制原理

· 熟悉MySQL读写分离原理

· 学会配置MySQL主从复制

· 学会配置MySQL读写分离

6.1 案例分析

6.1.1 案例概述

在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施的。

如图6.1所示,一台主MySQL带两台从MySQL做了数据复制,前端应用在进行数据库写操作时,对主设备进行操作,在进行数据库读操作时,对两台从设备进行操作,这样大量减轻了对主设备的压力。

图6.1 MySQL主从复制与读写分离

6.1.2 案例前置知识点

1.MySQL主从复制原理

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。

1)MySQL支持的复制类型

(1)基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。

(2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

(3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

2)复制的工作过程

MySQL复制的工作过程如图6.2所示。

图6.2 MySQL复制的工作过程

(1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。

(2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程——I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志。

(3)SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。

2.MySQL读写分离原理

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

图6.3 MySQL读写分离过程

目前较为常见的MySQL读写分离分为两种。

1)基于程序代码内部实现

在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。

2)基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。

(1)MySQL-Proxy。MySQL-Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL-Proxy用到生产环境。

(2)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和。

经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。本章后续案例通过Amoeba实现。

6.1.3 案例环境

1. 本案例环境

本案例环境使用五台服务器模拟搭建,具体的拓扑如图6.4所示。

图6.4 集群拓扑

案例环境如表10-1所示。

表10-1 案例环境

2. 案例需求

本案例要求通过Amoeba实现mysql数据库请求的读和写的分离

3. 案例实现思路

1) 安装MySQL数据库

2) 配置MySQL主从复制

3) 安装并配置Amoeba

4) 客户端测试读写分离

6.2 案例实施

6.2.1 搭建MySQL主从复制

(1)建立时间同步环境,在主节点上搭建时间同步服务器。

① 安装NTP。

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

② 配置NTP。

[root@localhost ~]# vim /etc/ntp.conf #添加如下两行

server 127.127.1.0

fudge 127.127.1.0 stratum 8

③ 重启服务并设置为开机启动。

[root@localhost ~]# systemctl restart ntpd

[root@localhost ~]# systemctl enable ntpd

Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

(2)在每台服务器上关闭firewalld或者指定端口、服务进行开放。

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

(3)在从节点上进行时间同步。

[root@localhost ~]# yum -y install ntpdate

[root@localhost ~]# ntpdate 192.168.8.134

(4)安装MySQL数据库。在Master、Slave1、Slave2上安装。

① 编译安装MySQL。

[root@localhost ~]# yum -y install ncurses-devel

[root@localhost ~]# tar zxvf cmake-2.8.6.tar.gz

[root@localhost ~]# cd cmake-2.8.6

[root@localhost cmake-2.8.6]# ./configure

[root@localhost cmake-2.8.6]# gmake

[root@localhost cmake-2.8.6]# gmake install

[root@localhost cmake-2.8.6]# cd

[root@localhost ~]#

[root@localhost ~]# tar zxvf mysql-5.6.36.tar.gz

[root@localhost ~]# cd mysql-5.6.36

[root@localhost mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc

[root@localhost mysql-5.6.36]# make && make install

② 优化调整。

[root@localhost mysql-5.6.36]# cp support-files/my-f /etc/f

[root@localhost mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

[root@localhost mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld

[root@localhost mysql-5.6.36]# chkconfig –add mysqld

[root@localhost mysql-5.6.36]# echo “PATH=$PATH:/usr/local/mysql/bin” >> /etc/profile

[root@localhost mysql-5.6.36]# . /etc/profile

③ 初始化数据库。

[root@localhost mysql-5.6.36]# groupadd mysql

[root@localhost mysql-5.6.36]# useradd -M -s /sbin/nologin mysql -g mysql

[root@localhost mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql

[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql

④ 启动MySQL服务。

[root@localhost ~]# systemctl start mysqld

[root@localhost ~]# systemctl enable mysqld

mysqld.service is not a native service, redirecting to /sbin/chkconfig.

Executing /sbin/chkconfig mysqld on

[root@localhost ~]# mysqladmin -u root password ’pwd123’

//为root用户设置密码

(5)配置MySQL Master主服务器。

① 在/etc/f中修改或者增加下面内容。

[root@localhost ~]# vim /etc/f

server-id= 11 //增加

log_bin = master-bin //修改

log-slave-updates = true //增加

② 重启MySQL服务。

[root@localhost ~]# systemctl restart mysqld

③ 登录MySQL程序,给从服务器以授权。

[root@localhost ~]# mysql -u root -p

mysql> GRANT REPLICATION SLAVE ON *.* TO ’myslave’@’192.168.8.%’ IDENTIFIED BY ’123456’;

mysql> FLUSH PRIVILEGES;

mysql> show master status;

+—————-+——–+———–+—————–+—————–+

| File |Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|

+—————-+——–+————+—————-+—————–+

|master-bin.000002| 410 | | | |

+—————–+——-+————+—————-+—————–+

1 row in set (0.00 sec)

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

(6)配置从服务器。

① 在/etc/f中修改或者增加下面内容。

[root@localhost ~]# vim /etc/f

server-id = 22 //增加

relay-log = relay-log-bin //增加

relay-log-index = slave-relay-bin.index //增加

这里要注意server-id不能相同。

② 重启MySQL服务。

[root@localhost ~]# systemctl restart mysqld

③ 登录MySQL,配置同步。

按主服务器结果更改下面命令中master_log_file和master_log_pos参数。

[root@localhost ~]# mysql -u root -p

mysql> change master to master_host=’192.168.8.134’,master_user=’myslave’, master_password=’123456’,master_log_file=’master-bin.000002’,master_log_pos=410;

Query OK, 0 rows affected, 2 warnings (0.05 sec)

④ 启动同步。

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

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

mysql> show slave statusG;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.8.134

Master_User: myslave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: master-bin.000002

Read_Master_Log_Pos: 410

Relay_Log_File: relay-log-bin.000002

Relay_Log_Pos: 284

Relay_Master_Log_File: master-bin.000002

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

…… //省略部分内容

(7)验证主从复制效果。

① 在主、从服务器上登录MySQL。

[root@localhost ~]# mysql –u root –p

mysql> show databases;

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

② 在主服务器上新建数据库db_test。

mysql> create database db_test;

③ 在主、从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;

+———————+

| Database |

+———————+

| information_schema |

| db_test |

| mysql |

| performance_schema |

| test |

+———————+

5 rows in set (0.00 sec)

6.2.2 搭建MySQL读写分离

Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for MySQL软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要为应用层访问MySQL的时候充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库。通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多企业的生产线上使用,其版本可在官网进行下载。

(1)在主机Amoeba上安装Java环境。

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

[root@localhost ~]# chmod +x jdk-6u14-linux-x64.bin

[root@localhost ~]# ./jdk-6u14-linux-x64.bin //根据提示按Enter键完成即可

[root@localhost ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

[root@localhost ~]# 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 ~]# source /etc/profile

[root@localhost ~]# 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)

Java环境已配置成功。

(2)安装并配置Amoeba软件。

[root@localhost ~]# mkdir /usr/local/amoeba

[root@localhost ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba

[root@node5 ~]# chmod -R 755 /usr/local/amoeba/

[root@localhost ~]# /usr/local/amoeba/bin/amoeba

amoeba start|stop //显示此内容说明Amoeba安装成功

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

① Master、Slave1、Slave2 中开放权限给 Amoeba 访问。

grant all on *.* to test@’192.168.8.%’ identified by ’’;

② 编辑amoeba.xml配置文件。

[root@localhost ~]# cd /usr/local/amoeba/

[root@localhost amoeba]# vim conf/amoeba.xml

…… //省略部分内容

以下修改后的内容为带下划线的部分。

<property name=”authenticator”>

<bean class=”com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator”>

<Property name=”user”>amoeba</property>

<property name=”password”>123456</property>

<property name=”filter”>

<bean class=”com.meidusa.amoeba.server.IPAccessController”>

<property name=”ipFile”>${amoeba.home}/conf/access_ list. conf</property>

</bean>

</property>

</bean>

</property>

…… //省略部分内容

以下修改后的内容为带下划线的部分,注意删除注释。

<queryRouter class=”com.meidusa.amoeba.mysql.parser.MysqlQueryrouter”>

<property name=”ruleLoader”>

<bean class=”com.meidusa.amoeba.route.TableRuleFileLoader”>

<property name=”rulfFile”>${amoeba.home}/conf/rule.xml </property>

<property name=”functionFile”>${amoeba.home}/conf/ruleFun ctionMap.xml</property>

</bean>

</property>

<property name=”sqlFunctionFile”>${amoeba.home}/conf/functionMap.xml </property>

<property name=”LRUMapSize”>1500</property>

<property name=”defaultPool”>master</property>

<property name=”writePool”>master</property>

<property name=”readPool”>slaves</property>

<property name=”needParse”>true</property>

</queryRouter>

③ 编辑dbServers.xml配置文件。

[root@localhost amoeba]# vim conf/dbServers.xml

…… //省略部分内容

以下修改后的内容为带下划线的部分,注意删除注释。

<!– mysql user –>

<property name=”user”>test</property>

<property name=”password”></property>

</factoryConfig>

…… //省略部分内容

以下修改后的内容为带下划线的部分。

<dbServer name=”master” parent=”abstractServer”>

<factoryConfig>

<!– mysql ip –>

<property name=”ipAddress”>192.168.8.134</property>

</factoryConfig>

</dbServer>

<dbServer name=”slavel” parent=”abstractServer”>

<factoryConfig>

<!– mysql ip –>

<property name=”ipAddress”>192.168.8.136</property>

</factoryConfig>

</dbServer>

<dbServer name=”slave2″ parent=”abstractServer”>

<factoryConfig>

<!– mysql ip –>

<property name=”ipAddress”>192.168.8.139</property>

</factoryConfig>

</dbServer>

<dbServer name=”slaves” virtual=”true”>

<poolConfig class=”com.meidusa.amoeba.server.MultipleServerPool”>

<!– Load balancing strategy: 1=ROUNDROBIN, 2=WEIGHTBASED, 3=HA–>

<property name=”loadbalance”>1</property>

<!– Separated mas,such as: server1,server2,server1 –>

<property name=”poolNames”>slave1,slave2</property>

</poolConfig>

</dbServer>

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

[root@localhost amoeba]# bin/amoeba start&

[root@localhost amoeba]# netstat -anpt | grep java

tcp6 00 127.0.0.1:51388 :::* LISTEN 31083/java

tcp6 00 :::8066 :::* LISTEN 31083/java

tcp6 00 192.168.8.100:58748192.168.8.139:3306ESTABLISHED31083/java

tcp6 00 192.168.8.100:37810192.168.8.136:3306ESTABLISHED 31083/java

tcp6 00 192.168.8.100:56066192.168.8.134:3306ESTABLISHED 31083/java

(4)测试。

① 在Client主机上。

[root@localhost ~]# yum -y install mysql

然后可以通过代理访问MySQL:

[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.8.100 -P8066

…… //省略部分内容

MySQL [(none)]>

② 在Master上创建一个表,同步到各从服务器上,然后关掉各从服务器的Slave功能,再插入区别语句。

mysql> use db_test;

Database changed

mysql> create table zang (id int(10),name varchar(10),address varchar(20));

Query OK, 0 rows affected (0.16 sec)

分别在两台从服务器上:

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)

然后在主服务器上:

mysql> insert into zang values(’1’,’zhang’,’this_is_master’);

Query OK,1 row affected (0.06 sec)

③ 从服务器上同步了表,手动插入其他内容。

slave1:

mysql> use db_test;

Database changed

mysql> insert into zang values(’2’,’zhang’,’this_is_slave1’);

Query OK,1 row affected (0.02 sec)

slave2:

mysql> use db_test;

Database changed

mysql> insert into zang values(’3’,’zhang’,’this_is_slave2’);

Query OK,1 row affected (0.02 sec)

④ 测试读操作。

在Client主机上第一次查询的结果如下。

MySQL [(none)]> select * from zang;

+——+——-+—————+

| id | name | address |

+——+——-+—————-+

| 2 | zhang | this_is_slave1 |

+——+——-+—————+

1 row in set (0.01 sec)

第二次查询的结果如下。

MySQL [(none)]> select * from zang;

+——+——-+—————+

| id | name | address |

+——+——-+—————-+

| 3 | zhang | this_is_slave2 |

+——+——-+—————+

1 row in set (0.01 sec)

第三次查询的结果如下。

MySQL [(none)]> select * from zang;

+——+——-+—————+

| id | name | address |

+——+——-+—————-+

| 2 | zhang | this_is_slave1 |

+——+——-+—————+

1 row in set (0.01 sec)

⑤ 测试写操作。

在Client主机上插入一条语句:

MySQL [(none)]> insert into zang values(’4’,’zhang’,’write_test’);

Query OK,1 row affected (0.08 sec)

但在Client上查询不到,最终只有在Master上才能查看到这条语句内容,说明写操作在Master服务器上。

mysql> select * from zang;

+——+——-+—————+

| id | name | address |

+——+——-+—————-+

| 1 | zhang | this_is_master |

| 4 | zhang | write_test |

+——+——-+—————+

2 row in set (0.01 sec)

由此验证,已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步;所有的读操作都分摊给了Slave从服务器,用来分担数据库压力。

以上就是关于gg修改器授权root_gg修改器授权管理的全部内容,感谢大家的浏览观看,如果你喜欢本站的文章可以CTRL+D收藏哦。

相关文章

热门下载

大家还在搜