2014年8月20日星期三

MySQL 主从数据库设置 - Dana丶Li

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
MySQL 主从数据库设置 - Dana丶Li  阅读原文»

1、复制的介绍

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引 以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

单向复制有利于健壮性、速度和系统管理:

· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。

· 通 过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但 修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。

· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的

双向复制是在单向复制的基础上由建立了一次由slave向master的单向复制,需要自己编写相应的更新策略,否则很容易出现数据不一致的问题。

2、环境

用的是radhat 5.1操作系统 mysql5.1.50版本

master 计算机名:ltest IP地址:172.31.70.51

slave 计算机名:erpdemo IP地址:172.31.70.95

注意:该源码安装包仅可以安装在Redhat5以上,在Redhat4上编译会出现问题。

3、mysql的单向复制

注意 mysql 数据库的版本,两个数据库版本要相同,或者slave比master版本高!这里采用的版本一致。

1)在ltest、erpdemo上安装mysql软件,通过源码安装

mysql软件可以在http://www.mysql.com 上下载,下来通过ftp或则其他的软件上传到服务器上:

1)在linux系统中添加运行Mysql的用户和组
[root@ltest ~]# groupadd mysql
[root@ltest ~]# useradd -g mysql mysql

2)解压缩源码包
[root@ltest ~]# tar -zxvf mysql-5.1.50.tar.gz
[root@ltest ~]# cd mysql-5.1.50

3)配置编译

配置mysql的安装目录

[root@ltest mysql-5.1.50]# ./configure --prefix=/usr/local/mysql)编译并安装
[root@ltest mysql-5.1.50]#make #编译
[root@ltest mysql-5.1.50]#make install

5)装载原始授权到数据库
[root@ltest mysql-5.1.50]#./scripts/mysql_install_db

6)copy mysql的配置文件到/etc目录
[root@ltest mysql-5.1.50]# cp support-files/my-medium.cnf /etc/my.cnf
7)copy mysql的启动脚本到资源目录
[root@ltest mysql-5.1.50]#cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld

8)添加mysql服务,让系统启动时自动启动mysql服务

[root@ltest mysql-5.1.50]#chmod +x /etc/rc.d/init.d/mysqld
[root@ltest mysql-5.1.50]#chkconfig --level 235 mysqld on
9)更改目录属主
[root@ltest mysql-5.1.50]#chown -R mysql.mysql /var/lib/mysql

10)设置环境变量
在 /etc/profile添加一行就 ,在运行mysql的时候就不用输入很长的路经了
export PATH=$PATH:/usr/local/mysql/bin

11)启动mysql服务
[root@ltest mysql-5.1.50]#service mysqld start
到这里mysql软件就按转完毕,erpdemo上的mysql安装按照上面的就行了。
b、配置mysql的配置文件
1)进入mysql命令行,为slave用户添加同步专用权限
输入密码 ,就进入到mysql命令行中了,一般刚装好的没有密码。
[root@ltest ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 3 to server version: 5.1.50
Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
mysql>

mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO 'replication'@'172.31.70.95' IENTIFIED BY '123456';
#给与从服务器用户replication的同步权限
mysql> Grant ALL PRIVILEGES ON *.* TO li@'%' IDENTIFIED BY '123456';

#如果需要的话添加管理用户,通过mysql的客户端来测试同步的情况
mysql>Flush privileges;
#刷新权限,使设置生效


2)配置ltest 的/etc/my.cnf配置文件

创建更新日志的目录并给mysql用户的权限
[root@ltest ~]# mkdir /var/log/mysql
[root@ltest ~]# chown -R mysql.mysql /var/log/mysql

修改配置文件中如下内容,如果没有添加上去:

log-bin=mysql-bin

启动二进制日志系统

binlog-do-db=test

二进制需要同步的数据库名

server-id = 1

本机数据库ID 标示为主,该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232–1之间的一个正整数值

log-bin=/var/log/mysql/updatelog

#设定生成log文件名,这里的路径没有mysql目录要手动创建并给于它mysql用户的权限。

binlog-ignore-db=mysql

# 避免同步mysql用户配置,以免不必要的麻烦



3)停止数据库,并将本地需要同步数据库打包拷贝到从数据库上

[root@ltest ~]#service mysqld stop #停止mysql的服务

[root@ltest ~]#tar -cvf /root/db.tar /usr/local/mysql/test #备份主服务器需要同步的数据库

[root@ltest ~]#scp /root/db.tar root@172.31.70.95:/usr/local/mysql #通过远程拷贝到从服务器上,通过这个拷贝的时候需要输入erpdemo的root密码。

[root@ltest ~]#Service mysqld start #启动主服务器mysql服务

二、同步slave 从服务器配置

1)配置slave服务器/etc/my.cnf文件

将以下配置启用:

<
C#并行编程-Parallel - 释迦苦僧  阅读原文»

菜鸟学习并行编程,参考《C#并行编程高级教程.PDF》,如有错误,欢迎指正。

TPL中引入了一个新命名空间System.Threading.Tasks,在该命名空间下Task是主类,表示一个类的异步的并发的操作,创建并行代码的时候不一定要直接使用Task类,在某些情况下可以直接使用Parallel静态类(System.Threading.Tasks.Parallel)下所提供的方法,而不用底层的Task实例。

Parallel.Invoke

试图将很多方法并行运行,如果传入的是4个方法,则至少需要4个逻辑内核才能足以让这4个方法并发运行,逻辑内核也称为硬件线程。

需要注意的是:1.即使拥有4个逻辑内核,也不一定能够保证所需要运行的4个方法能够同时启动运行,如果其中的一个内核处于繁忙状态,那么底层的调度逻辑可能会延迟某些方法的初始化执行。

2.通过Parallel.Invoke编写的并发执行代码一定不能依赖与特定的执行顺序,因为它的并发执行顺序也是不定的。

3.使用Parallel.Invoke方法一定要测量运行结果、实现加速比以及逻辑内核的使用率,这点很重要。

4.使用Parallel.Invoke,在运行并行方法前都会产生一些额外的开销,如分配硬件线程等。

好处:这是一种并行运行很多方法的简单方式,使用Parallel.Invoke,不需要考虑任务和线程的问题。

下面贴代码:

class Program
{
private static List<Product> ProductList = null;
/* coder:释迦苦僧
* 没有特定的执行顺序
* 示例中 基于电脑配置 采用了4个方法的并行编程
* Parallel.Invoke 首先会尝试并行启动4个方法,充分利用一个或多个物理处理器所提供的多个逻辑内核
* 但是在实际的并行执行中,至少要有4个逻辑内核才能满足4个方法的并行运行
* 如果有个或者多个逻辑内核处于繁忙状态,那么底层的调度逻辑可能会延迟某些方法的初始化执行
* 通过Parallel.Invoke编写的并发执行代码一定不能依赖与特定的执行顺序,因为它的并发执行顺序也是不定的。
*/
static void Main(string[] args)
{
ProductList
= new List<Product>();
Thread.Sleep(
3000);
Stopwatch swTask
= new Stopwatch();
swTask.Start();
/*执行并行操作*/
Parallel.Invoke(SetProcuct1_500, SetProcuct2_500, SetProcuct3_500, SetProcuct4_500);
swTask.Stop();
Console.WriteLine(
"500条数据 并行编程所耗时间:" + swTask.ElapsedMilliseconds);

ProductList
= new List<Product>();
Thread.Sleep(
3000);/*防止并行操作 与 顺序操作冲突*/
Stopwatch sw
= new Stopwatch();
sw.Start();
SetProcuct1_500();
SetProcuct2_500();
SetProcuct3_500();
SetProcuct4_500();
sw.Stop();
Console.WriteLine(
"500条数据 顺序编程所耗时间:" + sw.ElapsedMilliseconds);

ProductList
= new List<Product>();
Thread.Sleep(
3000);
swTask.Restart();
/*执行并行操作*/
Parallel.Invoke(()
=> SetProcuct1_10000(), () => SetProcuct2_10000(), () => SetProcuct3_10000(), () => SetProcuct4_10000());
swTask.Stop();
Console.WriteLine(
"10000条数据 并行编程所耗时间:" + swTask.ElapsedMilliseconds);

ProductList
= new List<Product>();
Thread.Sleep(
3000);
sw.Restart();
SetProcuct1_10000();
SetProcuct2_10000();
SetProcuct3_10000();
SetProcuct4_10000();
sw.Stop();
Console.WriteLine(
"10000条数据 顺序编程所耗时间:" + sw.ElapsedMilliseconds);

Console.ReadLine();
}
private static void SetProcuct1_500()
{
for (int index = 1; index < 500; index++)
{
Product model
= new Product();
model.Category
= "Category" + index;
model.Name
= "Name" + index;
model.SellPrice
= index;
ProductList.Add(model);
}
Console.WriteLine(
"SetProcuct1 执行完成");
}
private static void SetProcuct2_500()
{
for (int index = 500; index < 1000; index++)
{
Product model
= new Product();
model.Category
= "Category" + index;
model.Name
= "Name" + index;
model.SellPrice
= index;
ProductList.Add(model);
}
Console.WriteLine(
"SetProcuct2 执行完成");
}
private static void SetProcuct3_500()
{
for (int index = 1000; index < 2000; index++)
{
Product model
= new Product();
model.Category
= "Category" + index;
model.Name
= "Name" + index;
model.SellPrice
= index;
ProductList.Add

阅读更多内容

没有评论:

发表评论

server-id = 2

从服务器ID号,不要和主ID相同 ,

如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。

master-host = 172.31.70.51

指定主服务器IP地址

声明

转载有价值的IT博客,版权属原作者所有

标签

博客归档