Mysql_Replication


關於資料複製的專有名詞:
1. 主伺服器(Master Server):
執行交易將資料寫入的地方。
保存二進位日誌檔。
傳遞資料給從伺服器。

2. 從伺服器(Slave Server):
跟主伺服器要事件的資料。
將事件內容同步到本地的伺服器。

3. 二進位日誌檔(Binary Log):
紀錄每一個改動的資料。
日誌內容依交易群組而切割。

4. 同步資料複製(Synchronous Replication):
在伺服器執行交易時,該交易需等到資料被複製到其他伺服器後才會提交。
確保資料的一致性,但速度較慢(相較於非同步資料複製)。
MySQL叢集伺服器才提供同步資料複製。

5. 非同步資料複製(Asynchronous Replication):
交易馬上提交並複製到其他伺服器。
不保證資料的一致性,但速度較快(相較於同步資料複製)。
一般的MySQL伺服器就有提供此功能


資料複製架構:
1. 主-從資料複製。
這樣一對一的複製架構,可用來作異地備援,避免因意外造成資料丟失。

2. 一主-多從資料複製。
這樣一對多的複製架構,使用者可以用多個從伺服器來分散資料的讀取負載,也讓使用者可以輕易的延展(Scale-Out)從伺服器進而提昇讀取效能。但新增/修改/刪除交易,還是由主伺服器負責,也引此,這樣的架構,較適合用在查詢負載較重的OLAP系統。

3. 主-主資料複製。
這是建構MySQL複製中最常見的架構。這兩台伺服器都可以讀/寫,且互為備援。在應用程式的支援下(自動切換資料庫連線),可以達成高用度的系統。

4. 多主資料複製。

相較於”一主-多從”與”主-主”的資料複製架構,多主資料複製可以在提昇效能的前提下,又達到高可用度的目的。


資料複製的流程圖:

在這個流程圖中,並沒有將全部的步驟都繪畫出來,只針對主要的流程加以說明(例如,這個圖就沒有畫出,當從伺服器中的SQL程序將資料輸入資料庫時,也會將資料寫入Bin Log)。讓我們來走過一次流程吧!
1. 當用戶端連線到資料庫時,資料庫即建立一個session。當資料從session將資料輸入到資料庫中,則資料庫會將收到的事件(insert/update/delete)紀錄一份到Bin Log。
2. 從伺服器的I/O執行緒會定期跟主伺服器的Dump執行緒要資料,而主伺服器的Dump執行緒會將資料傳給從伺服器的I/O執行緒,並由I/O執行緒將資料傳入到從伺服器的Relay Log。
3. SQL執行緒會將資料從Relay Log取出,並輸入到本機的資料庫中。




Replication實作 一: 單向(主-從)
1. master: 編輯/etc/my.cnf 確認以下設定
[mysqld]
server-id=1
log-bin=/xxx/master-bin
slave:
[mysqld]
server-id=2
2. 在master上建立帳號&授與權限
CREATE USER 'repluser'@'10.0.0.52' IDENTIFIED BY 'YOUR_PASSWORD';
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.52';
FLUSH PRIVILEGES;
3.備份master上資料庫
mysqldump -u root -p --master-data --all-databases > all_mysql_db.sql
4.將master資料庫回復到slave
mysql -u root -p --default-character-set=utf8 < all_mysql_db.sql
# 重新啟動slave mysql
/etc/init.d/mysql restart
5.設定 Slave 資料庫實體,指定 Master 資料庫的登入資訊,並且正式啟動複寫機制
slave> CHANGE MASTER TO
-> MASTER_HOST = 'master_host',
-> MASTER_PORT = 3306,
-> MASTER_USER = 'repluser',
-> MASTER_PASSWORD = 'YOUR_PASSWORD',
-> MASTER_LOG_FILE='mysql-bin.000005',   //file跟pos可以不用指定
-> MASTER_LOG_POS=98;
slave> START SLAVE;
6.檢查資料複寫狀態:
SHOW SLAVE STATUS \G;


Replication實作 二: 環狀(A->B->C->A)
目的:是要實現在ABC三台任意一台數據服務器上執行數據操作,其它任意兩台都要同步實現相同的操作
1.配置三台 my.cnf 加上
log-slave-updates = on
server-id = 1[2|3]     //三台id要注意不可相同
log-bin=mysql-bin     //確定log-bin有開啟
binlog-do-db = test   //指定slave-要同步的master 資料庫,不設定將同步所有資料庫
修改完成後重啟資料庫

2.在每台數據庫服務器上為slave創建一個用戶並授予複製的權限 ex:A->B主從
mysql> CREATE USER 'repluser'@'10.0.0.2' IDENTIFIED BY 'YOUR_PASSWORD';
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.2';
FLUSH PRIVILEGES;
重啟mysql服務
3.查看master狀態:
鎖表
mysql> FLUSH TABLES WITH READ LOCK;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 98 | | |
+------------------+----------+--------------+------------------+
解鎖
mysql> UNLOCK TABLES;
配置A與_B連結:
mysql> CHANGE MASTER TO
-> MASTER_HOST = 'master_host',
-> MASTER_PORT = 3306,
-> MASTER_USER = 'repluser',
-> MASTER_PASSWORD = 'YOUR_PASSWORD',
-> MASTER_LOG_FILE='mysql-bin.000005',   //file跟pos可以不用指定
-> MASTER_LOG_POS=98;
5. B -> C 與 C -> A 參照 1、2 丶3步驟

資料複寫災難復原:
復原一:當主從因某些因素斷開時,重新建立主從連線所以步驟如下: 1.備份的影像檔 2.備份的二進位日誌檔 執行步驟: 1.確認備份的影像檔 + 二進位日誌檔是否正確 2.資料回復 3.套用二進位日誌檔 EX:
mysqlbinlog -- start-position=position --stop-datetime=datetime master-bin.000001 master-bin.000002 … | mysql -u root -p
重新設定資料複寫
 CHANGE MASTER TO
-> ...
-> MASTER_LOG_FILE = 'master-bin.000010'
-> MASTER_LOG_POS = '123456';
資料復原二:master 當掉主從斷開,slave重新連上線後繼續複寫出現錯誤: Slave I/O: Got fatal error 1236 from master when reading data from binary log: ‘Client requested master to start replication from impossible position’, Error_code: 1236 這是因為slave重新連上線後繼續要求當掉的bin下一筆資料,導致出現錯誤,解決方法
master> show master status\G
File: master-bin.000073
Position: 21959116
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
在slave上將file跟位置指向下一個新開的檔案
slave> slave stop;
slave> change master to
->MASTER_LOG_FILE='master-bin.000073',
->MASTER_LOG_POS=0;
slave> slave start;
slave> show slave status\G;

Perl (二) 變數類型


Perl 入門:
  1)純量變數 (scalar variable):符號 $,內容可以是整數、小數、字串單引號或雙引號括住,雙引號括住裏面可帶變數或脫逸字元。

$n1 = 25;                        # 25
$n2 = 2.5;                       # 2.5
$s1 = "There are $n1 dollars.\n" # 雙引號字串
$s2 = 'There is no spoon.';      # 單引號字串

  2)陣列變數 (array variable):符號 @,其字面常數為用小括弧圍起來的資料,可使用 .. 運算子表示某一定範圍的值
@array = (1, 2.0, 'spoon'); # 三個元素的陣列
@10 = (1 .. 10);            # 從 1 到 10 的陣列
@alph = ("a" .. "z");       # 小寫英文字母表陣列
@days = qw/Monday
Tuesday
Wednesday
Thursday
Firday
Saturday
Sunday/;                    # 星期一到星期天的英文單字陣列
### 上面@days 用了另一種運算子 qw/值/,這會將//範圍內的文字以官白字元拆開成字串放置到陣列內,等同於:
@days2 = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Firday', 'Saturday', 'Sunday');
### 字串的取值可以用中括弧加索引值,索引值由0遞增,如:
@array = (1, 2.0, 'spoon'); 
print $array[0]; # 印出 1
print $array[1]; # 印出 2
print $array[2]; # 印出 spoon

  3)雜湊變數 (hash variable):符號 %,雜湊變數則是一種 key-value 配對的資料型態,例如
%ages = ('Tony' => 28,
         'John' => 35,
         'Mary' => 29);
### 其中Tony' 、 'John' 、 'Mary' 為 key , 28 、 35 、 29 各是所屬的 value ,存取元素則利用中括弧加 key 值
print $ages{'Tony'}; # 印出 28
print $ages{'John'}; # 印出 35
print $ages{'Mary'}; # 印出 29

#!/usr/bin/env perl
#

# 基本語法
# ;用於語句結束符
# #用於註釋
# ""用於表示字符串,變數可以在""中被替換,如:
$var = "world.";
print "Hello $var\n"; #輸出為:Hello world.
# ''用於表示字符串,''內的所有內容都被當作純文本,如:
print 'Hello $var\n'; #輸出為:Hello $var\n
# 關於style
print("Hello, world\n"); #OK
print "Hello, world\n";  #OK


# 變數類型
# Perl主要有三種變數類型: 純量變數、純量陣列、hash陣列、指標
# Perl不需要預先聲明變數,直接將變數值附給變數即可
# 標量表示單一值,以$後接變數名來表示一個標量
# 標量可以存儲字符串、整數、浮點數
$var_scalar = 1;
print $var_scalar;
# 或者
print "The scalar's value is $var_scalar\n";
print "The scalar's value is", $var_scalar, "\n";
# 用@後接變數名來表示一個陣列
# 陣列保存列表,列表是標量集合
@var_array = (1, 2, 3, "a", "b", "c");
# 或者
@var_array = qw(1 2 3 a b c);
@var_array = qw/1 2 3 a b c/;
print "The 2nd elm of var_array is $var_array[1]\n";
# 陣列切片
# 1. 輸出陣列中某兩個值
print @var_array[0, 2], "\n";
# 2. 用連接符..輸出陣列中一個區間中的所有值
print @var_array[0..3], "\n";
# 用%後接變數名表示一個hash,即"鍵值對"的集合
# = >符號左邊是鍵,右邊是值
%var_hashes = (a => "Apple", b => "Blizzard");
print "One elm of var_hashes is $var_hashes{\"b\"}\n";
# 用keys()或values()兩個函數分別獲取hash表的所有鍵或所有值
my @allKeys = keys %var_hashes;
my @allValues = values %var_hashes;

# 常用內建變數
# $_ 默認變數
# @_ 默認陣列變數,保存傳遞給子程序的所有參數
# $! 當前錯誤信息
# $0 當前腳本的文件名
# $$ 當前腳本的進程號
# @ARGV 命令行參數列表


# 內建操作符和操作函數
### 數值運算子
# +, -, *, /    
# ==, !=, <, >, <=, >= 
# +=, -=, *=    
# &&, and     
# ||, or     
# != not     
# = 附值    
# % 取餘數    
# < = > 如果左邊大於右邊返回-1,否則 +1
# ++, --, **    
# ^      
### 字串運算子
# eq  equality   
# ne  inequality
# lt  less than
# gt  greater than
# le  less than or equal
# ge  greater than or equal
# . 串連兩個字符串
# x 重複字符串
# .. 以..符號相端點,創建一串值
print "Baidu"x3;
print "\n";

# 變數作用域
# 主要有my和local兩種作用域
# my,聲明的層次&同一層次
# local, 聲明的層次&以內層次
my $var_my_scope;
local $var_local_scope;
# 不加my或local,默認為全局作用域 
# !建議不要用過多全局的變數
# !建議在腳本開頭加上如下兩句:
use strict;
use warnings;
# 這樣,解釋器會強制你使用my或local來表示變數的作用域,
# 這樣做可以幫你檢查到一些普通的編程錯誤


# 條件判斷和循環控制
# if, while, for, foreach,until, unless
# if
my $isOK = 1;
if ($isOK) { # ()和{}在這裡都是必須使用的
 print "OK\n";
} else {
 print "Ooops...\n";
}
# 或者這樣寫:
print "OK\n" if $isOK;
# while
my $count = 10;
while($count > 0) {
 print "while ... $count\n";
 $count -= 1;
}
# 因為foreach的存在,for在Perl中用得很少,它的寫法和C一樣
my @array = (1, 2, 3, "a");
foreach my $elm (@array) {
 print $elm, "\n";
}


# 文件操作,即IO
# open()函數打開一個文件
# 讀文件$file,將文件的標識符附給$fileHandle
my $file2open="./1.txt";
my $fileHandle;
open($fileHandle, "<$file2open");
# <>符號用於讀取$fileHandle指向的內容
# 利用鑽石操作符號<>,你可以:
# 1. 將$fileHandle指向的內容附給一個標量,這樣只讀一行就over
# my $line = <$fileHandle>;
# 2. 將$fileHandle指向的內容附給一個陣列,將每一行作為一個element
# my @lines = <$fileHandle>;
# 3. 常用於while或者foreach
foreach (<$fileHandle>) { 
 print $_;
}
# 寫文件$file
open($fileHandle, ">$file2open");
print $fileHandle "abc";
# 追加寫入
open($fileHandle, ">>$file2open");
print $fileHandle "def";
# 關閉文件
close($fileHandle);


# 子程序
# @_ 符號包含所有傳遞給子程序的參數
sub subFunc1 {
 print "\nsubroutine 1\n";
}
sub subFunc2 {
 print "subroutine 2\n";
 return "I like Perl.\n";
}
sub subFunc3 {
 my ($param1, $param2) = @_;
 print $param1, $param2, "\n";
}
# calling subroutine
subFunc1();
# 或者
&subFunc1;
print subFunc2(); 
subFunc3("Ooops...", 123);


# 正則表達式
# 查找:在$re_test中查找oo
# =~是綁定操作符
my $re_test = "Google";
if($re_test =~ /oo/) {
 print "Bingo!\n";
}
# 替換;在$re_test中用xx替換oo
if($re_test =~ s/oo/xx/){
 print $re_test, "\n";
}
# 匹配修飾符
# i, g
my $re_test2 = "FacebOok";
if($re_test2 =~ /oo/i){
 print "Bingo!\n";
}

Cisco Route IOS設定 (一)


一、Cisco 路由器四種設定模式

使用者模式:  >
管理者模式:  #
組態模式:   (config)#
介面管理模式:(config-if)#
            (config-router)#

二、路由器有三種密碼可以設定即:console(使用者)密碼、管理者模式密碼、遠端登入密碼。
    1)設定console密碼
Router>en
Router#conf t
Router(config)#line console 0
Router(config-line)#password ccna
Router(config-line)#login

   2)設定管理者密碼
Router>en
Router#conf t
Router(config)# enable password ccna12
不用下login使密碼生效,即可離開。
預設情況在show run會看到沒有加密密碼,可用secret來加密管理者密碼
Router(config)# enable secret ccna34
Router(config)# exit   二次
   注意此時我們是對ccna34這個新管理者密碼加密,舊的管理者密碼仍然存在,但登入是以新的加密管理者密碼登入

   3)其他密碼加密:可使用service password-encryption 來對組態檔中全部密碼加密
Router(config)# service password-encryption
Router(config)# exit
Router# show run
   可發現密碼全部加密了

三、設定路由器IP
   查詢路由器所有網路介面狀態
Router# show ip int brief
   設定ip假設只有fastethernet0/0   fastethernet0/1
Router(config)# int fa0/0
Router(config-if)# ip address 192.168.1.254 255.255.255.0
Router(config-if)# no shutdown
Router(config-if)# int fa0/1
Router(config-if)# ip address 192.168.2.254 255.255.255.0
Router(config-if)# no shutdown
   中間會看到網路介面啟動訊息,記得下no shutdown才會啟動介面,預設是不啟動。

四、

Perl 學習手冊(一)


Perl 發展最初目的是設計在 UNIX 處理報表更方便的腳本語言。發展到今天 Perl 的最新版為 5.16.1 ,並有豐富的程式庫 CPAN ,其內有各種應用的模組。

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:demo.pl
# 功能:示範 Perl 程式
# 作者:張凱慶
# 時間:西元 2013 年 1 月

參考網站:Perl入門 
參考連結:Perl 學習手札
參考連結:Perl的基本語法
參考連結:Perl 筆記
參考連結:Perl 教學

google blogger use code highlight with syntaxhighlighter


google blogger use code highlight with syntaxhighlighter

1.到SyntaxHighlighter下載最新檔案。
2.將檔案放到公開可取得位置如google 協同平台
3.將以下程式碼插入到blogger-Html語法裏

<!-- 設定載入 shCore.css 與  shThemeDefault.css -->
<link href="http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shCore.css" rel="stylesheet" type="text/css"/>
<link href="http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shThemeDefault.css" rel="stylesheet" type="text/css"/>

<!-- 設定需要載入的核心檔案 shCore.js -->
<script src="http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shCore.js" type="text/javascript"/>

<!-- 設定需要載入的程式語言檔案  -->
<script src='http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shBrushCSharp.js' type='text/javascript'/>
<script src='http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shBrushJScript.js' type='text/javascript'/>
<script src='http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shBrushSql.js' type='text/javascript'/>
<script src='http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shBrushVb.js' type='text/javascript'/>
<script src='http://sites.google.com/site/sharedderrick/syntaxhighlighter3x/shBrushXml.js' type='text/javascript'/>

<!-- 設定啟用 highlighter   -->
<script type="text/javascript">
SyntaxHighlighter.config.bloggerMode = true; 
SyntaxHighlighter.all()
</script>

4.如果語法有使用到html記得先轉換格式:
Postable | Making your code friendly

5.測試語法:
# /bin/bash
#LANG=C
clear