Wait! What? Did he say “Server”?! Alright, so perhaps that’s cutting close to click baiting but hopefully you’ll see the funny side.
In my original post discussing my reasons for choosing a Surface Pro 3 to replace my laptop I explained that it would need to meet my work needs. In my day job I specialise in SQL Server and so any laptop needs to be able to run the management tools and also full editions of SQL Server. Windows RT based devices aren’t going to be suitable due to their inability to run x86 desktop applications.
The Surface Pro 3 I selected was the top end Core i7 with 8GB of RAM and 512GB SSD for storage. That means I can add the Hyper-V role to Windows 8.1 Professional and host virtual machines configured to provide a Virtual iSCSI SAN and Windows Failover Clusters hosting SQL Server Failover Clustered Instances. As I said, “the tablet that replaces your server”. 🙂
Now at this point I feel it’s important to highlight that I take no credit for the setups I’ve managed to create since the steps to do this have been well documented by Jonathan Kehayias (b|t) who is a very well respected SQL Server MVP. I did have to figure out some of the Cluster Shared Volumes setup myself so perhaps I do take a tiny amount of credit. 😉
So what have I managed to get running on my Surface Pro 3? Here is a rundown of the virtual infrastructure:
Guest Description
Windows Server Version
SQL Server Version
Roles and Functions
Domain Controller 1
Windows Server 2008 R2
Active Directory 1
Domain Controller 2
Windows Server 2008 R2
Active Directory 2
iSCSI Virtual SAN
Windows Server 2008 R2
iSCSI Host Server / SMB File Shares
SQL2K8R2CLSTR1
Windows Server 2008 R2
SQL Server 2008 R2 – Cluster Node 1
Windows Server Failover Cluster Node – SQL Server Clustered Instance (iSCSI) – Uses iSCSI Shared Storage
SQL2K8R2CLSTR2
Windows Server 2008 R2
SQL Server 2008 R2 – Cluster Node 2
Windows Server Failover Cluster Node – SQL Server Clustered Instance (iSCSI) – Uses iSCSI Shared Storage
SQL2K12CLSTR1
Windows Server 2012
SQL Server 2012 – Cluster Node 1
Windows Server Failover Cluster Node – SQL Server Clustered Instance (SMB) – Uses SMB File Shares for Storage
SQL2K12CLSTR2
Windows Server 2012
SQL Server 2012 – Cluster Node 2
Windows Server Failover Cluster Node – SQL Server Clustered Instance (SMB) – Uses SMB File Shares for Storage
SQL2K14CLSTR1
Windows Server 2012 R2
SQL Server 2014 – Cluster Node 1
Windows Server Failover Cluster Node – SQL Server Clustered Instance (iSCSI & CSV) – Uses iSCSI Hosted Cluster Shared Volumes
SQL2K14CLSTR2
Windows Server 2012 R2
SQL Server 2014 – Cluster Node 2
Windows Server Failover Cluster Node – SQL Server Clustered Instance (iSCSI & CSV) – Uses iSCSI Hosted Cluster Shared Volumes
There are two key technologies in play that allow me to run these, and even then with only 8GB of memory I can’t run all of these at the same time. The first is the Dynamic Memory features of Hyper-V and secondly the Microsoft iSCSI Host Services available as a free download. The Dynamic Memory feature allows you to specify an upper limit for the memory allocated to a virtual machine (VM), in most cases these are set to 2GB for each VM, but only the memory required by the VM at the time is assigned. That means that the Active Directory and iSCSI VM’s I listed above consume less than 1GB of memory once they settle down. That leaves enough room to run additional VM’s which can either be two nodes of a Windows/SQL Cluster or individual nodes.
Utilising the Microsoft iSCSI Host Services (Jonathan covers all that in his step-by-step guide) I have been able to create a virtual SAN that the two Windows Server 2008 R2 VM’s connect to using the iSCSI Connector software. This allows the Cluster Validation process to complete which is key to being able to create the Windows Failover Cluster.
The two Windows Server 2012 nodes utilise the new support for SMB shares to host the Cluster Quorum and also support for SMB shares in SQL Server 2012 which means the Windows and SQL Server Clustered Instances can be created without the need for iSCSI setup. The Windows Server 2012 R2 and SQL Server 2014 Clustered Instances make use of the new Cluster Shared Volumes which also requires the use of iSCSI hosted drives. The setup is almost the same as for the Windows Server 2008 R2 clusters except that the drives are mounted on both nodes at the same time, using mount points instead of drive letters, and so do not need to failover like a traditional cluster (this makes failover quicker along with some other advantages).
Now at this point you’re probably thinking why is this so special because the reality is that any Intel Core i5 or i7 laptop would support this virtual infrastructure? Well of course that is true but there is something about the look on peoples faces when I explain that the Surface Pro 3 tablet I’m holding is running SQL Server Clustered Instances.
If I could change one thing about that Surface Pro 3 it would be to have 16GB of memory in the top of the range models but using Dynamic Memory I can work around that. Surface Pro 3 isn’t going to replace your server infrastructure but it can make a great machine for SQL Server professionals like me. J
{"id":null,"mode":"button","open_style":"in_place","currency_code":"GBP","currency_symbol":"\u00a3","currency_type":"decimal","blank_flag_url":"https:\/\/thedigitallifestyle.com\/w\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/thedigitallifestyle.com\/w\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":500,"top_media_type":"none","featured_image_url":false,"featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Leave a tip","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"TheDigitalLifestyle.com","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"TheDigitalLifestyle.com","form_subtitle":null,"currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for being a supporter!","payment_confirmation_title":"TheDigitalLifestyle.com","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"Enter the name on your card."},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email address"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}