用MySQL内建复制功能来优化可用性(下)_MySQL
程序员文章站
2022-04-13 18:03:59
...
MySQL优化
第三步:创建相互的主从关系
首先在B机上的my.cnf文件中,在[mysqld]部分中加入'log-bin',接着重新启动mysqld,然后创建可在它的上面执行复制功能的用户帐号,使用:
GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'password';
在B机上运行'FLUSH PRIVILEGES'命令,以便装入在加入复制用户后的新的授权表,接着回到A机上,在
它的'my.cnf'中加入下面几行:
master-host=10.1.1.2
master-user=replicate master-password=password
在重启A机的服务程序之后,现在我们一拥有了在A机与B机之间的相互主-从关系。不管在哪个服务器上 更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注意的是:我不敢确定一个备机合并二进 制日志变化的速度有多快,所以用这种方法来进行插入或更新语句的负载平衡可能不是一个好办法。
第四步:修改你的数据库连接程序
既然你已经在A机和B机之间建立了一个相互的关系,你需要修改数据库连接程序,以便从这种方式中得 到好处。下面的函数首先试图与A机连接,如果不能建立连接则与B机连接。
/******************************************************** function db_connect()
returns a link identifier on success, or false on error ********************************************************/ function db_connect(){ $username = "replUser"; $password = "password"; $primary = "10.1.1.1"; $backup = "10.1.1.2";
# attempt connection to primary if(!$link_id = @mysql_connect($primary, $username, $password)) # attempt connection to secondary $link_id = @mysql_connect($secondary, $username, $password) return $link_id; }
?>
我在两种情况下对使用了上面技术的数据库连接建立过程进行了测试,一种是主MySQL服务程序关闭了, 但是服务器还在运行,另一种情况是主服务器关闭了。如果只是mysqld关闭了,连接会马上转向备机;但是 如果整个服务器关闭了,就出现了无限地等待(两分钟后我放弃了跟踪 -- 很短的注意跨度),因为PHP在查 找一个不存在的服务器。不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,然而我们 可以使用fsockopen来模拟一个超时处理。
第五步:一个改进的数据库连接程序
/******************************************************** function db_connect_plus()
returns a link identifier on success, or false on error ********************************************************/ function db_connect_plus(){ $username = "username"; $password = "password"; $primary = "10.1.1.1"; $backup = "10.1.1.2"; $timeout = 15; // timeout in seconds
if($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return $link = mysql_connect($primary, $username, $password); } if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return $link = mysql_connect($secondary, $username, $password); }
return 0; }
?>
这个新改进的函数向我们提供了一个可调的超时特性,这正是mysql_connect函数所缺少的。如果连接 立即失败,这种情况如机器"活"着,但mysqld"当"掉了,函数立即移到第二个服务器。上面的函数相当健壮, 在试图进行连接之前先测试一下,查看服务程序是否在指定端口进行监听,让你的脚本在一段可接受的时间 段后超时,允许你适当地对出错情况进行处理。如果你修改了缺省端口3306,请保证对端口号进行修改。
第三步:创建相互的主从关系
首先在B机上的my.cnf文件中,在[mysqld]部分中加入'log-bin',接着重新启动mysqld,然后创建可在它的上面执行复制功能的用户帐号,使用:
GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'password';
在B机上运行'FLUSH PRIVILEGES'命令,以便装入在加入复制用户后的新的授权表,接着回到A机上,在
它的'my.cnf'中加入下面几行:
master-host=10.1.1.2
master-user=replicate master-password=password
在重启A机的服务程序之后,现在我们一拥有了在A机与B机之间的相互主-从关系。不管在哪个服务器上 更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注意的是:我不敢确定一个备机合并二进 制日志变化的速度有多快,所以用这种方法来进行插入或更新语句的负载平衡可能不是一个好办法。
第四步:修改你的数据库连接程序
既然你已经在A机和B机之间建立了一个相互的关系,你需要修改数据库连接程序,以便从这种方式中得 到好处。下面的函数首先试图与A机连接,如果不能建立连接则与B机连接。
/******************************************************** function db_connect()
returns a link identifier on success, or false on error ********************************************************/ function db_connect(){ $username = "replUser"; $password = "password"; $primary = "10.1.1.1"; $backup = "10.1.1.2";
# attempt connection to primary if(!$link_id = @mysql_connect($primary, $username, $password)) # attempt connection to secondary $link_id = @mysql_connect($secondary, $username, $password) return $link_id; }
?>
我在两种情况下对使用了上面技术的数据库连接建立过程进行了测试,一种是主MySQL服务程序关闭了, 但是服务器还在运行,另一种情况是主服务器关闭了。如果只是mysqld关闭了,连接会马上转向备机;但是 如果整个服务器关闭了,就出现了无限地等待(两分钟后我放弃了跟踪 -- 很短的注意跨度),因为PHP在查 找一个不存在的服务器。不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,然而我们 可以使用fsockopen来模拟一个超时处理。
第五步:一个改进的数据库连接程序
/******************************************************** function db_connect_plus()
returns a link identifier on success, or false on error ********************************************************/ function db_connect_plus(){ $username = "username"; $password = "password"; $primary = "10.1.1.1"; $backup = "10.1.1.2"; $timeout = 15; // timeout in seconds
if($fp = fsockopen($primary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return $link = mysql_connect($primary, $username, $password); } if($fp = fsockopen($secondary, 3306, &$errno, &$errstr, $timeout)){ fclose($fp); return $link = mysql_connect($secondary, $username, $password); }
return 0; }
?>
这个新改进的函数向我们提供了一个可调的超时特性,这正是mysql_connect函数所缺少的。如果连接 立即失败,这种情况如机器"活"着,但mysqld"当"掉了,函数立即移到第二个服务器。上面的函数相当健壮, 在试图进行连接之前先测试一下,查看服务程序是否在指定端口进行监听,让你的脚本在一段可接受的时间 段后超时,允许你适当地对出错情况进行处理。如果你修改了缺省端口3306,请保证对端口号进行修改。